blob: 5f66bc013ccc476bc781a3205dbf18bd08b947a8 [file]
{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearch/1.1/","xmlns$batch":"http://schemas.google.com/gdata/batch","xmlns$gd":"http://schemas.google.com/g/2005","xmlns$gAcl":"http://schemas.google.com/acl/2007","xmlns$gs":"http://schemas.google.com/spreadsheets/2006","xmlns$thr":"http://purl.org/syndication/thread/1.0","xmlns$sites":"http://schemas.google.com/sites/2008","xmlns$dc":"http://purl.org/dc/terms","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev"},"updated":{"$t":"2021-09-16T14:49:34.608Z"},"title":{"$t":"Content"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/feeds/content/chromium.org/dev"},{"rel":"next","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev?alt\u003djson\u0026start-index\u003d1001\u0026max-results\u003d500"},{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev"},{"rel":"http://schemas.google.com/g/2005#post","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev"},{"rel":"http://schemas.google.com/g/2005#batch","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/batch"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev?alt\u003djson\u0026start-index\u003d501\u0026max-results\u003d500"},{"rel":"previous","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev?alt\u003djson\u0026start-index\u003d1\u0026max-results\u003d501"}],"generator":{"version":"1","uri":"https://sites.google.com","$t":"Google Sites"},"openSearch$startIndex":{"$t":"501"},"openSearch$itemsPerPage":{"$t":"500"},"entry":[{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5586430994157532514"},"published":{"$t":"2016-11-07T07:15:22.246Z"},"updated":{"$t":"2019-11-04T18:04:45.922Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:45.922Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5586430994157532514"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5586430994157532514"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5586430994157532514"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2015-11-26"},{"index":"B","name":"OEM","$t":"\u003cwhite label\u003e"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"\"\u003e\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Heli"},{"index":"E","name":"Board name(s)","$t":"heli"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R45"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4722131136993821749"},"published":{"$t":"2016-11-07T07:26:30.170Z"},"updated":{"$t":"2019-11-04T18:04:42.317Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:42.316Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4722131136993821749"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4722131136993821749"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4722131136993821749"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2014-09-02"},{"index":"B","name":"OEM","$t":"Toshiba"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eToshiba Chromebook 2\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Swanky"},{"index":"E","name":"Board name(s)","$t":"swanky"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R36"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6712401362826506183"},"published":{"$t":"2016-11-07T07:20:37.525Z"},"updated":{"$t":"2019-11-04T18:04:38.998Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:38.997Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6712401362826506183"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6712401362826506183"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6712401362826506183"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2014-08-31"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebook 11 (C730 / C730E / C735)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Gnawty"},{"index":"E","name":"Board name(s)","$t":"gnawty"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R34"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4046206098029132164"},"published":{"$t":"2016-11-07T07:08:59.546Z"},"updated":{"$t":"2019-11-04T18:04:34.660Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:34.659Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4046206098029132164"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4046206098029132164"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4046206098029132164"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2015-04-23"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebook 15.6\" (CB3-531)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Banjo"},{"index":"E","name":"Board name(s)","$t":"banjo"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R42"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3538775735615510976"},"published":{"$t":"2016-11-07T07:22:20.183Z"},"updated":{"$t":"2019-11-04T18:04:30.097Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:30.096Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3538775735615510976"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3538775735615510976"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3538775735615510976"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2014-09-01"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eHP Chromebook 11 G3 / G4 / G4 EE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Kip"},{"index":"E","name":"Board name(s)","$t":"kip"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R34"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3387866787299009292"},"published":{"$t":"2016-11-07T07:27:14.755Z"},"updated":{"$t":"2019-11-04T18:04:26.342Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:26.342Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3387866787299009292"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3387866787299009292"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3387866787299009292"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2014-10-13"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eSamsung Chromebook 2 11 - XE500C12\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Winky"},{"index":"E","name":"Board name(s)","$t":"winky"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R36"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3077176791033975335"},"published":{"$t":"2016-11-07T07:32:47.211Z"},"updated":{"$t":"2019-11-04T18:04:22.206Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:22.205Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3077176791033975335"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3077176791033975335"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3077176791033975335"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2015-09-01"},{"index":"B","name":"OEM","$t":"AOpen"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAOpen Chromebox Commercial\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Ninja"},{"index":"E","name":"Board name(s)","$t":"ninja"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":"R43"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2207372180925190815"},"published":{"$t":"2016-11-07T07:11:09.381Z"},"updated":{"$t":"2019-11-04T18:04:17.743Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:04:17.742Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2207372180925190815"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2207372180925190815"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2207372180925190815"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2015-02-28"},{"index":"B","name":"OEM","$t":"Dell"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eDell Chromebook 11 (3120)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Candy"},{"index":"E","name":"Board name(s)","$t":"candy"},{"index":"F","name":"Base board","$t":"rambi"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"BayTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R39"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2284193493869367628"},"published":{"$t":"2016-11-07T07:31:48.020Z"},"updated":{"$t":"2019-11-04T18:03:59.328Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:03:59.327Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2284193493869367628"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2284193493869367628"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2284193493869367628"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2015-08-01"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebase\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Kitty"},{"index":"E","name":"Board name(s)","$t":"nyan_kitty"},{"index":"F","name":"Base board","$t":"nyan"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.10"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Tegra K1 T124"},{"index":"K","name":"Form Factor","$t":"Chromebase"},{"index":"L","name":"First Release","$t":"R40"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4278227250026217778"},"published":{"$t":"2016-11-07T06:56:45.461Z"},"updated":{"$t":"2019-11-04T18:03:17.422Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:03:17.421Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4278227250026217778"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4278227250026217778"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4278227250026217778"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2014-05-25"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-chromebook-11\"\u003eHP Chromebook 11 G2\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Skate"},{"index":"E","name":"Board name(s)","$t":"daisy_skate"},{"index":"F","name":"Base board","$t":"snow"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Exynos 5250"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R34"},{"index":"M","name":"EOL/AUE","$t":"R75"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3880157375870717835"},"published":{"$t":"2016-11-07T06:48:15.052Z"},"updated":{"$t":"2019-11-04T18:03:14.112Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:03:14.111Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3880157375870717835"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3880157375870717835"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3880157375870717835"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2014-05-18"},{"index":"B","name":"OEM","$t":"LG"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/lg-chromebase-22cv241-w\"\u003eLG Chromebase 22CV241 \u0026amp; 22CB25S\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Monroe"},{"index":"E","name":"Board name(s)","$t":"monroe"},{"index":"F","name":"Base board","$t":"beltino"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Haswell"},{"index":"K","name":"Form Factor","$t":"Chromebase"},{"index":"L","name":"First Release","$t":"R33"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1768569644658256311"},"published":{"$t":"2016-11-07T07:03:16.044Z"},"updated":{"$t":"2019-11-04T18:03:10.760Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:03:10.760Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1768569644658256311"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1768569644658256311"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1768569644658256311"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2014-05-18"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-chromebook-2\"\u003eSamsung Chromebook 2 13\"\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Pi"},{"index":"E","name":"Board name(s)","$t":"peach_pi"},{"index":"F","name":"Base board","$t":"peach"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Exynos 5450"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R34"},{"index":"M","name":"EOL/AUE","$t":"R75"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6729895642292166716"},"published":{"$t":"2016-11-07T07:02:28.851Z"},"updated":{"$t":"2019-11-04T18:03:07.340Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:03:07.340Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6729895642292166716"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6729895642292166716"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6729895642292166716"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2014-05-04"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-chromebook-2\"\u003eSamsung Chromebook 2 11\"\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Pit"},{"index":"E","name":"Board name(s)","$t":"peach_pit"},{"index":"F","name":"Base board","$t":"peach"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Exynos 5450"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R30"},{"index":"M","name":"EOL/AUE","$t":"R75"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8272009479091199385"},"published":{"$t":"2016-11-07T06:38:59.376Z"},"updated":{"$t":"2019-11-04T18:02:59.298Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:59.297Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8272009479091199385"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8272009479091199385"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8272009479091199385"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2014-01-30"},{"index":"B","name":"OEM","$t":"Toshiba"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/toshiba-cb30-chromebook\"\u003eToshiba Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Leon"},{"index":"E","name":"Board name(s)","$t":"leon"},{"index":"F","name":"Base board","$t":"slippy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Haswell"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R31"},{"index":"M","name":"EOL/AUE","$t":"R76"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3147052245526204482"},"published":{"$t":"2016-11-07T06:41:09.454Z"},"updated":{"$t":"2019-11-04T18:02:55.541Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:55.540Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3147052245526204482"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3147052245526204482"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3147052245526204482"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2014-01-15"},{"index":"B","name":"OEM","$t":"Dell"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/dell-chromebook-11\"\u003eDell Chromebook 11\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Wolf"},{"index":"E","name":"Board name(s)","$t":"wolf"},{"index":"F","name":"Base board","$t":"slippy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Haswell"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R31"},{"index":"M","name":"EOL/AUE","$t":"R76"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3576216280307223445"},"published":{"$t":"2016-11-07T06:56:04.936Z"},"updated":{"$t":"2019-11-04T18:02:52.002Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:52.001Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3576216280307223445"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3576216280307223445"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3576216280307223445"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2013-09-29"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-chromebook-11\"\u003eHP Chromebook 11 G1\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Spring"},{"index":"E","name":"Board name(s)","$t":"daisy_spring"},{"index":"F","name":"Base board","$t":"snow"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Exynos 5250"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R27"},{"index":"M","name":"EOL/AUE","$t":"R72"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/430285441164556933"},"published":{"$t":"2016-11-07T06:36:33.301Z"},"updated":{"$t":"2019-11-04T18:02:27.210Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:27.210Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/430285441164556933"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/430285441164556933"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/430285441164556933"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2013-09-29"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-chromebook-14\"\u003eHP Chromebook 14\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Falco"},{"index":"E","name":"Board name(s)","$t":"falco \u0026 falco_li"},{"index":"F","name":"Base board","$t":"slippy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Haswell"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R30"},{"index":"M","name":"EOL/AUE","$t":"R76"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7408862282840152254"},"published":{"$t":"2016-11-07T06:39:58.284Z"},"updated":{"$t":"2019-11-04T18:02:22.516Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:22.516Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7408862282840152254"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7408862282840152254"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7408862282840152254"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2013-09-12"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c720-chromebook\"\u003eAcer C720/C70P/C740 Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Peppy \u0026 Pepto"},{"index":"E","name":"Board name(s)","$t":"peppy"},{"index":"F","name":"Base board","$t":"slippy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Haswell"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R30"},{"index":"M","name":"EOL/AUE","$t":"R76"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5289213715130409269"},"published":{"$t":"2016-10-31T19:24:45.591Z"},"updated":{"$t":"2019-11-04T18:02:17.716Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:17.715Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5289213715130409269"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5289213715130409269"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5289213715130409269"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2013-01-30"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook\"\u003eHP Pavilion Chromebook 14\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Butterfly"},{"index":"E","name":"Board name(s)","$t":"butterfly"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"SandyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R22"},{"index":"M","name":"EOL/AUE","$t":"R65"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2899479699691127201"},"published":{"$t":"2016-10-31T19:15:29.464Z"},"updated":{"$t":"2019-11-04T18:02:11.125Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:02:11.124Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2899479699691127201"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2899479699691127201"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2899479699691127201"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2013-01-30"},{"index":"B","name":"OEM","$t":"Google"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/chromebook-pixel\"\u003eGoogle Chromebook Pixel\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Link"},{"index":"E","name":"Board name(s)","$t":"link"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"IvyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R22"},{"index":"M","name":"EOL/AUE","$t":"R69"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3614971600450171543"},"published":{"$t":"2016-10-31T19:22:10.917Z"},"updated":{"$t":"2019-11-04T18:01:59.434Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:59.433Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3614971600450171543"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3614971600450171543"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3614971600450171543"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2012-12-30"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/lenovo-thinkpad-x131e-chromebook\"\u003eLenovo Thinkpad X131e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Stout"},{"index":"E","name":"Board name(s)","$t":"stout"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"IvyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R22"},{"index":"M","name":"EOL/AUE","$t":"R69"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4924766806121814711"},"published":{"$t":"2016-10-31T19:12:33.249Z"},"updated":{"$t":"2019-11-04T18:01:54.592Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:54.592Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4924766806121814711"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4924766806121814711"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4924766806121814711"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Release","$t":"2012-10-30"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook\"\u003eAcer C7 Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Parrot"},{"index":"E","name":"Board name(s)","$t":"parrot"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"SandyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R21"},{"index":"M","name":"EOL/AUE","$t":"R65"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1029674029428410342"},"published":{"$t":"2017-01-04T06:16:26.151Z"},"updated":{"$t":"2019-11-04T18:01:51.024Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:51.023Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1029674029428410342"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1029674029428410342"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1029674029428410342"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2012-10-30"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook\"\u003eAcer C7 Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Parrot"},{"index":"E","name":"Board name(s)","$t":"parrot_ivb"},{"index":"F","name":"Base board","$t":"parrot"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"IvyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R27"},{"index":"M","name":"EOL/AUE","$t":"R69"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/456155404975583811"},"published":{"$t":"2016-11-07T07:01:01.786Z"},"updated":{"$t":"2019-11-04T18:01:46.460Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:46.459Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/456155404975583811"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/456155404975583811"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/456155404975583811"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2012-10-14"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook\"\u003eSamsung Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Snow"},{"index":"E","name":"Board name(s)","$t":"daisy"},{"index":"F","name":"Base board","$t":"daisy"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"arm"},{"index":"J","name":"Platform","$t":"Exynos 5250"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R22"},{"index":"M","name":"EOL/AUE","$t":"R75"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No "}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4068598333027286838"},"published":{"$t":"2016-10-31T19:06:03.829Z"},"updated":{"$t":"2019-11-04T18:01:42.945Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:42.944Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4068598333027286838"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4068598333027286838"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4068598333027286838"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2012-07-01"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge\"\u003eSamsung Chromebox Series 3\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Stumpy"},{"index":"E","name":"Board name(s)","$t":"stumpy"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"SandyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":"R17"},{"index":"M","name":"EOL/AUE","$t":"R65"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1399597856154949922"},"published":{"$t":"2016-10-31T19:05:08.377Z"},"updated":{"$t":"2019-11-04T18:01:38.237Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:38.237Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1399597856154949922"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1399597856154949922"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1399597856154949922"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Release","$t":"2012-04-29"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge\"\u003eSamsung Chromebook Series 5 550\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Lumpy"},{"index":"E","name":"Board name(s)","$t":"lumpy"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"SandyBridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R17"},{"index":"M","name":"EOL/AUE","$t":"R65"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No "}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6833821315430918700"},"published":{"$t":"2016-10-31T17:38:34.140Z"},"updated":{"$t":"2019-11-04T18:01:34.549Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:34.548Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6833821315430918700"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6833821315430918700"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6833821315430918700"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Release","$t":"2011-06-30"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook\"\u003eAcer AC700 Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"ZGB"},{"index":"E","name":"Board name(s)","$t":"x86-zgb \u0026 x86-zgb_he"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86"},{"index":"J","name":"Platform","$t":"PineTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R12"},{"index":"M","name":"EOL/AUE","$t":"R58"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1015258213427960215"},"published":{"$t":"2016-10-31T17:35:34.938Z"},"updated":{"$t":"2019-11-04T18:01:30.458Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:30.457Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1015258213427960215"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1015258213427960215"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1015258213427960215"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"13"},"gs$field":[{"index":"A","name":"Release","$t":"2011-05-30"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook\"\u003eSamsung Series 5 Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Alex"},{"index":"E","name":"Board name(s)","$t":"x86-alex \u0026 x86-alex_he"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86"},{"index":"J","name":"Platform","$t":"PineTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R11"},{"index":"M","name":"EOL/AUE","$t":"R58"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1637981053247679063"},"published":{"$t":"2016-10-31T17:34:11.971Z"},"updated":{"$t":"2019-11-04T18:01:24.459Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:24.459Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1637981053247679063"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1637981053247679063"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1637981053247679063"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Release","$t":"2010-12-05"},{"index":"B","name":"OEM","$t":"Google"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information\"\u003eCr-48\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Mario"},{"index":"E","name":"Board name(s)","$t":"x86-mario"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86"},{"index":"H","name":"Kernel","$t":"3.8"},{"index":"I","name":"Kernel ABI","$t":"x86"},{"index":"J","name":"Platform","$t":"PineTrail"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"~R8"},{"index":"M","name":"EOL/AUE","$t":"R56"},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"No"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7587565296998403889"},"published":{"$t":"2019-10-08T23:36:38.058Z"},"updated":{"$t":"2019-11-04T18:01:07.299Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:07.298Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7587565296998403889"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7587565296998403889"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7587565296998403889"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-09-04"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://news.acer.com/acer-delivers-full-lineup-of-chromebooks-for-family-fun-entertainment-productivity\"\u003eAcer Chromebook 311 (CB311-9HT/9H) )\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"gik"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R76"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6792203782679653581"},"published":{"$t":"2019-10-08T23:34:32.962Z"},"updated":{"$t":"2019-11-04T18:01:02.491Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:01:02.491Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6792203782679653581"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6792203782679653581"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6792203782679653581"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-09-04"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://news.acer.com/acer-delivers-full-lineup-of-chromebooks-for-family-fun-entertainment-productivity\"\u003eAcer Chromebook Spin 311 (CP311-2H)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"gik360"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R76"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4483739995381775548"},"published":{"$t":"2019-10-08T23:32:25.984Z"},"updated":{"$t":"2019-11-04T18:00:57.184Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:57.183Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4483739995381775548"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4483739995381775548"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4483739995381775548"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-09-04"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://news.acer.com/acer-delivers-full-lineup-of-chromebooks-for-family-fun-entertainment-productivity\"\u003eAcer Chromebook 315 (CB315-3H/3HT)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Blorb"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R76"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5993099964939488921"},"published":{"$t":"2019-10-08T23:30:56.957Z"},"updated":{"$t":"2019-11-04T18:00:52.566Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:52.566Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5993099964939488921"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5993099964939488921"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5993099964939488921"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-09-04"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://news.acer.com/acer-delivers-full-lineup-of-chromebooks-for-family-fun-entertainment-productivity\"\u003eAcer Chromebook 314 (CB314-1H/1HT)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Droid"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R76"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8707597793170571513"},"published":{"$t":"2019-08-28T20:29:24.122Z"},"updated":{"$t":"2019-11-04T18:00:40.490Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:40.490Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8707597793170571513"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8707597793170571513"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8707597793170571513"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-06-17"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://psref.lenovo.com/Product/Lenovo_Laptops/Lenovo_Chromebook_S340\"\u003eLenovo Chromebook S340-14\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Laser14"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R74"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/860653412403210259"},"published":{"$t":"2019-08-27T22:51:12.516Z"},"updated":{"$t":"2019-11-04T18:00:35.983Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:35.982Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/860653412403210259"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/860653412403210259"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/860653412403210259"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-06-17"},{"index":"B","name":"OEM","$t":"Lenovo "},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/gb/en/laptops/lenovo/student-chromebooks/Lenovo-Chromebook-C340-11/p/88LGCC31288\"\u003eLenovo Chromebook C340-11\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Laser"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R74"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7666263525494286001"},"published":{"$t":"2019-07-15T18:38:29.564Z"},"updated":{"$t":"2019-11-04T18:00:31.368Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:31.368Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7666263525494286001"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7666263525494286001"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7666263525494286001"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2019-04-22"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www8.hp.com/us/en/laptops/product-details/27924352\"\u003eHP Chromebook 11 G7 EE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Mimrock"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R73"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2092958956822609651"},"published":{"$t":"2019-07-15T18:43:47.074Z"},"updated":{"$t":"2019-11-04T18:00:26.220Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:26.219Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2092958956822609651"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2092958956822609651"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2092958956822609651"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-04-22"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www8.hp.com/us/en/laptops/product-details/27924571\"\u003eHP Chromebook x360 11 G2 EE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Meep"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R73"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2336221205469282552"},"published":{"$t":"2019-03-22T21:57:26.614Z"},"updated":{"$t":"2019-11-04T18:00:21.200Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:21.200Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2336221205469282552"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2336221205469282552"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2336221205469282552"}],"author":[{"name":{"$t":"Jack Huang"},"email":{"$t":"jachuang@chromium.org"}}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-22"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://9to5google.com/2019/01/23/acer-amd-chromebooks-education/\"\u003eAcer Chromebook Spin 311 (R721T)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Kasumi360"},{"index":"E","name":"Board name(s)","$t":"grunt"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2109410150504203771"},"published":{"$t":"2019-03-22T21:52:19.902Z"},"updated":{"$t":"2019-11-04T18:00:16.376Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:16.376Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2109410150504203771"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2109410150504203771"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2109410150504203771"}],"author":[{"name":{"$t":"Jack Huang"},"email":{"$t":"jachuang@chromium.org"}}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-22"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://9to5google.com/2019/01/23/acer-amd-chromebooks-education/\"\u003eThe Acer Chromebook 311 (C721) \u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Kasumi"},{"index":"E","name":"Board name(s)","$t":"grunt"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3097923448635928046"},"published":{"$t":"2019-03-15T06:50:19.519Z"},"updated":{"$t":"2019-11-04T18:00:10.813Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:10.812Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3097923448635928046"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3097923448635928046"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3097923448635928046"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-08"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.acer.com/ac/en/US/press/2019/484286\"\u003eAcer Chromebook 512(C851/C851T)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"sparky"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4482912555587842354"},"published":{"$t":"2019-03-18T20:30:36.834Z"},"updated":{"$t":"2019-11-04T18:00:00.988Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T18:00:00.987Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4482912555587842354"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4482912555587842354"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4482912555587842354"}],"author":[{"name":{"$t":"Alex Chromium Pau"},"email":{"$t":"alexpau@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-06"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/student-chromebooks/Lenovo-14e-Chromebook/p/88ELC1S9991\"\u003eLenovo 14e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"liara"},{"index":"E","name":"Board name(s)","$t":"liara"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8491526679864516785"},"published":{"$t":"2019-07-15T18:25:33.329Z"},"updated":{"$t":"2019-11-04T17:59:52.880Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:52.880Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8491526679864516785"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8491526679864516785"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8491526679864516785"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-02-27"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/student-chromebooks/Lenovo-100e-Chromebook-2nd-Gen-MTK/p/88ELC1S9989\"\u003eLenovo 100e Chromebook 2nd Gen (MTK)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Sycamore"},{"index":"E","name":"Board name(s)","$t":"hana"},{"index":"F","name":"Base board","$t":"oak"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.18"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"MT8173"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6397279136473147219"},"published":{"$t":"2019-03-05T03:59:45.776Z"},"updated":{"$t":"2019-11-04T17:59:45.474Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:45.473Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6397279136473147219"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6397279136473147219"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6397279136473147219"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-02-27"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://eu-acerforeducation.acer.com/resources/bett-show-2019-acer-unveils-new-suite-of-11-6-inch-chromebooks/\"\u003eAcer Chromebook Spin 511\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"bobba360"},{"index":"E","name":"Board name(s)","$t":"bobba360"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5124166159039332411"},"published":{"$t":"2019-03-05T03:57:45.750Z"},"updated":{"$t":"2019-11-04T17:59:39.446Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:39.445Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5124166159039332411"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5124166159039332411"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5124166159039332411"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-02-27"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://eu-acerforeducation.acer.com/resources/bett-show-2019-acer-unveils-new-suite-of-11-6-inch-chromebooks/\"\u003eAcer Chromebook 311\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"bobba"},{"index":"E","name":"Board name(s)","$t":"bobba"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/906576779011772660"},"published":{"$t":"2019-07-15T18:29:21.913Z"},"updated":{"$t":"2019-11-04T17:59:33.575Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:33.575Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/906576779011772660"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/906576779011772660"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/906576779011772660"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-02-27"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/student-chromebooks/Lenovo-300e-Chromebook-2nd-Gen-MTK/p/88ELC1S9988\"\u003eLenovo 300e Chromebook 2nd Gen (MTK)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Sycamore360"},{"index":"E","name":"Board name(s)","$t":"hana"},{"index":"F","name":"Base board","$t":"oak"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.18"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"MT8173"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6806479209139456514"},"published":{"$t":"2019-03-21T20:13:04.092Z"},"updated":{"$t":"2019-11-04T17:59:29.157Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:29.157Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6806479209139456514"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6806479209139456514"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6806479209139456514"}],"author":[{"name":{"$t":"Saurabh Madan"},"email":{"$t":"ssmadan@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2019-01-21"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://store.hp.com/us/en/pdp/hp-chromebook-11-g6-ee\"\u003eHP Chromebook 11A G6 EE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Barla"},{"index":"E","name":"Board name(s)","$t":"grunt"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Right Port"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9068047761184378238"},"published":{"$t":"2019-02-15T18:41:00.721Z"},"updated":{"$t":"2019-11-04T17:59:23.500Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:23.500Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9068047761184378238"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9068047761184378238"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9068047761184378238"}],"author":[{"name":{"$t":"Jack Huang"},"email":{"$t":"jachuang@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2019-01-07"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.acer.com/ac/en/US/press/2019/479116\"\u003eAcer Chromebook 315\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Aleena"},{"index":"E","name":"Board name(s)","$t":"grunt"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6849826165537362067"},"published":{"$t":"2019-03-22T21:48:12.191Z"},"updated":{"$t":"2019-11-04T17:59:18.156Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-04T17:59:18.155Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6849826165537362067"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6849826165537362067"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6849826165537362067"}],"author":[{"name":{"$t":"Saurabh Madan"},"email":{"$t":"ssmadan@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2019-01-06"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://store.hp.com/us/en/pdp/hp-chromebook-14-db0020nr\"\u003eHP Chromebook 14 (db0000-db0999)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"careena"},{"index":"E","name":"Board name(s)","$t":"grunt"},{"index":"F","name":"Base board","$t":"grunt"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Stoney Ridge"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R70"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Right Port"}]},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3930644578600207526"},"published":{"$t":"2015-07-23T01:25:04.722Z"},"updated":{"$t":"2019-11-01T19:42:06.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-13T00:19:55.168Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Running FAFT with MobLab"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-DEPRECATED-PLEASE-VISIT-https:-sites.google.com-a-chromium.org-dev-chromium-os-testing-moblab-20170714-\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003e***DEPRECATED, PLEASE VISIT \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\u003c/a\u003e *** (20170714)\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6163425214481340131"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab/faft-testing-with-moblab"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3930644578600207526"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3930644578600207526"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3930644578600207526"}],"author":[{}],"sites$pageName":{"$t":"faft-testing-with-moblab"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/865931445538937208"},"published":{"$t":"2013-10-31T02:16:14.728Z"},"updated":{"$t":"2019-11-01T18:00:18.121Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-01T18:00:15.439Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Reporting memory bloat/leak issues"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"624\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:0px solid rgb(0,0,0);padding:11px;width:1393px;height:174px\"\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:18pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-How-to-file-a-bug-for-memory-bloat-leak-issues:\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow to file a bug for memory bloat/leak issues:\u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cul\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003eUse \u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry?template\u003dMemory%20usage\" target\u003d\"_blank\"\u003ethis template\u003c/a\u003e when filing a bug for memory bloat/leak issues.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSee \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/master/docs/memory/filing_memory_bugs.md\"\u003einstructions here\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ca href\u003d\"http://www.chromium.org/for-testers/command-line-flags\" style\u003d\"font-size:13.3333px\" /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:18pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-How-to-take-a-snapshot-of-memory-usage:\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow to take a snapshot of memory usage:\u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eSee \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/master/docs/memory/debugging_memory_issues.md#taking-a-heap-dump\"\u003einstructions here\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3087306851372487833"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/for-testers/providing-memory-details"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/865931445538937208"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/865931445538937208"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/865931445538937208"}],"author":[{"name":{"$t":"Kenji Baheux"},"email":{"$t":"kenjibaheux@chromium.org"}}],"sites$pageName":{"$t":"providing-memory-details"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"UCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3545069394357994158"},"published":{"$t":"2015-01-08T21:53:20.467Z"},"updated":{"$t":"2019-11-01T00:01:02.680Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-11-01T00:00:58.697Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Paint Team (paint-dev)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"margin:0;padding:0;max-width:100ex;text-align:justify\"\u003e\r\n\r\n\u003cdiv style\u003d\"border:1px solid red;background-color:#ff000036;padding:1ex;margin:0 5ex 3ex 5ex;text-align:center\"\u003e\r\n The paint team has been subsumed into the new \u003ca href\u003d\"//chromium.org/teams/rendering\"\u003erendering core\u003c/a\u003e team. Please see the rendering core page for details about ongoing paint and canvas work.\r\n\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/paint-team"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3545069394357994158"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3545069394357994158"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3545069394357994158"}],"author":[{"name":{"$t":"Chris Harrelson"},"email":{"$t":"chrishtr@chromium.org"}}],"sites$pageName":{"$t":"paint-team"},"sites$revision":{"$t":"29"}},{"gd$etag":"\"UCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1273642415345641600"},"published":{"$t":"2016-12-27T18:43:02.611Z"},"updated":{"$t":"2019-10-29T18:53:24.627Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-29T18:53:21.821Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Windows Binary Sizes"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eChrome binaries sometimes increase in size for unclear reasons and investigating these regressions can be quite tricky. There are a a few tools that help with investigating these regressions or just looking for wasted bytes in DLLs or EXEs. The tools are:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cul\u003e\u003cli\u003etools\\win\\ShowGlobals - this executable (must be built from a VS solution) uses DIA2 (and is based off of the dia2dump sample whose source comes with Visual Studio) to print all ‘interesting’ global variables. Just pass the path to a PDB file and details about any large or redundant global variables will be printed. Large global variables are simple enough to understand. Redundant or repeated global variables are when the same global ends up in the binary multiple times - sometimes dozens or hundreds of times. This happens when a non-integral global variable (typically a struct, array, float, or double, or an integral type with a non-trivial constructor) is defined as static or const in a header file, causing it to be instantiated in multiple translation units. The constants kWastageThreshold and kBigSizeThreshold can be used to configure how much information ShowGlobals reports. Making these command-line parameters is left as an exercise for the reader.\u003c/li\u003e\u003cli\u003etools\\win\\pdb_compare_globals.py - this uses ShowGlobals.exe to get the interesting global variables from two PE files and then print what has changed, either different sizes or different interesting globals. This is designed for understanding size regressions, since binary size regressions, even when they are mostly due to code size, often have a correlated effect on global variables\u003c/li\u003e\u003cli\u003etools\\win\\pe_summarize.py - this displays a summary of the size of the sections in the DLLs or EXEs whose paths are passed to it. If two copies of the same DLL/EXE are passed to it then the size differences are printed as a summary, to make regressions and improvements easier to see. This is most often used for measuring progress or seeing what section has grown.\u003c/li\u003e\u003cli\u003etools\\win\\linker_verbose_tracking.py - this scans the output of \"link /verbose\" in order to see why a particular object file was linked in. This can either be because it was listed on the command line (perhaps it was in a source set) or because it was referenced (often indirectly) by an object file that was listed on the command line.\u003c/li\u003e\u003cli\u003eSymbolSort - this is a third party tool \u003ca href\u003d\"https://github.com/adrianstone55/SymbolSort/\" rel\u003d\"nofollow\"\u003eavailable on github\u003c/a\u003e that generates various reports, including a sorted-by-size list of all symbols, including functions. The -diff option to SymbolSort is particularly useful for identifying where a change in size is coming from, grouped in various ways. Usage: SymbolSort -in new\\chrome.dll.pdb -diff old\\chrome.dll.pdb -out change.txt\u003c/li\u003e\u003cli\u003eSymbolSort data can be visualized using webtreemap - see \u003ca href\u003d\"https://github.com/rongjiecomputer/bloat-win\" style\u003d\"color:rgb(17,85,204);font-family:arial,sans-serif;font-size:12.8px\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttps://github.com/rongjiecomputer/bloat-win\u003c/a\u003e for an example\u003c/li\u003e\u003cli\u003eStatic initializers waste code size and create process-private data. The source to a static_initializers tool that will look for symbol names associated with static initializers is in the Chromium repo in tools\\win\\static_initializers.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eDetails of how and when to use these tools are shown below.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf looking for size saving opportunities then “ShowGlobals.exe  file.pdb” can be used to find duplicated or large global variables that may be unnecessary. Typical (shortened for this document) results look like this - the first set of entries are duplicated globals, the second set of entries are large globals:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e#Dups  DupSize  Size   Section  Symbol-name\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e805      805                    std::piecewise_construct\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e3        204                    rgb_red\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e3        204                    rgb_green\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e3        204                    rgb_blue\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e187      187                    WTF::in_place\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e4        160                    extensions::api::g_factory\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e...\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                122784    2     kBrotliDictionary\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                65536     2     jpeg_nbits_table\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                57080     2     propsVectorsTrie_index\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                53064     3     unigram_table\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                50364     2     kNetworkingPrivate\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e                47152     3     device::UsbIds::vendors_\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e...\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eThe actual output is tab separated and can be most easily visualized by pasting into a spreadsheet to ensure that the columns line up.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eSome fixed issues include:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003ewebrtc regression was analyzed to find a fix - see\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d734631#c14\"\u003e https://bugs.chromium.org/p/chromium/issues/detail?id\u003d734631#c14\u003c/a\u003e for the many steps, and \u003ca href\u003d\"https://chromium-review.googlesource.com/c/567030/\"\u003ecrrev.com/c/567030\u003c/a\u003e\u003c/li\u003e\u003cli\u003eWe have 216 functions instances of color_xform_RGBA\u0026lt;T\u0026gt; totaling 68,184 bytes, down from 300 instances totaling 146496 bytes (crbug.com/677450 and crbug.com/680973). This waste was found by using SymbolSort's -diff option to investigate a sizes regression.\u003c/li\u003e\u003cli\u003eA regression in chrome_watcher.dll was methodically analyzed to understand precisely where the size was coming from - see the steps listed out starting at \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d717103#c24\"\u003ethis bug comment\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eThe most egregious problems shown by these reports have been fixed but some remaining issues include:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFour copies of 68 byte rgb_red, rgb_green, rgb_blue, rgb_pixelsize arrays in chrome.dll and chrome_child.dll - https://github.com/libjpeg-turbo/libjpeg-turbo/issues/114 (unfixable)\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e~800 copies of std::piecewise_construct - \u003ca href\u003d\"https://connect.microsoft.com/VisualStudio/feedback/details/1059462\" rel\u003d\"nofollow\"\u003ehttps://connect.microsoft.com/VisualStudio/feedback/details/1059462\u003c/a\u003e (next version of VC++?)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eThe large kBrotliDictionary and jpeg_nbits_table arrays can be seen, but those are used and are in the read-only section, so there is nothing to be done.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eWhen investigating a regression pdb_compare_globals.py can be used to find out what large or duplicated global variables have showed up between two builds. Just pass both PDBs and a summary of the changes will be printed. This uses ShowGlobals.exe to generate the list of interesting global variables and then prints a diff.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eWhen investigating a regression (or testing a fix) it can be useful to use pe_summarize.py to print the size of all of the sections with a PE, or to compare to PE files (two versions of chrome.dll, for instance). This is the ultimate measure of success for a change - has it made the binary smaller or larger, and if so where?\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eIf an unwanted global variable is being linked in then linker_verbose_tracking.py can be used to help answer the question of “why?” First you need to find out what object file defines the variable. For instance, ff_cos_131072 and the other ff_* globals are defined in rdft.c. When rdft.obj is pulled in then Chrome gets significantly bigger. Some of this is discussed in comments #25 to #27 here: \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d624274#c27.\"\u003ehttps://bugs.chromium.org/p/chromium/issues/detail?id\u003d624274#c27.\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eIn order to get verbose linker output you need to modify the appropriate BUILD.gn file to add the /verbose linker flag. For chrome.dll I make the following modification:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"font-size:13.3333px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003ediff --git a/chrome/BUILD.gn b/chrome/BUILD.gn\u003c/div\u003e\u003cdiv\u003eindex 58586fc..c15d463 100644\u003c/div\u003e\u003cdiv\u003e--- a/chrome/BUILD.gn\u003c/div\u003e\u003cdiv\u003e+++ b/chrome/BUILD.gn\u003c/div\u003e\u003cdiv\u003e@@ -354,6 +354,7 @@ if (is_win) {\u003c/div\u003e\u003cdiv\u003e       \"/DELAYLOAD:winspool.drv\",\u003c/div\u003e\u003cdiv\u003e       \"/DELAYLOAD:ws2_32.dll\",\u003c/div\u003e\u003cdiv\u003e       \"/DELAYLOAD:wsock32.dll\",\u003c/div\u003e\u003cdiv\u003e+      \"/verbose\",\u003c/div\u003e\u003cdiv\u003e     ]\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e     if (!is_component_build) {\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eThen build chrome.dll, redirecting the verbose output to a text file:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"font-size:13.3333px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u0026gt; ninja -C out\\release chrome.dll \u0026gt;verbose.txt\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eAlternately you can use the techniques discussed in the \u003ca href\u003d\"https://developers.google.com/web/updates/2019/10/chromium-chronicle-7\"\u003eThe Chromium Chronicle: Preprocessing Source\u003c/a\u003e to get the linker command and then manually re-run that command with /verbose appended, redirecting to a text file.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eThen linker_verbose_tracking.py is used to find why a particular object file is being pulled in, in this case mime_util.obj:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"font-size:13.3333px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u0026gt; python linker_verbose_tracking.py verbose.txt mime_util.obj\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eBecause there are multiple object files called mime_util.obj the script will be searching for for all of them, as shown in the first line of output:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u0026gt;python linker_verbose_tracking.py verbose.txt mime_util.obj\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e  Searching for [u'net.lib(mime_util.obj)', u'base.lib(mime_util.obj)']\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eYou can specify which version you want to search for by including the .lib name in your command-line search parameter, which is just used for sub-string matching:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u0026gt;python linker_verbose_tracking.py verbose.txt base.lib(mime_util.obj)\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eTypical output looks like this:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u0026gt;python tools\\win\\linker_verbose_tracking.py verbose08.txt drop_data.obj\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eDatabase loaded - 3844 xrefs found\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eSearching for common_sources.lib(drop_data.obj)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ecommon_sources.lib(drop_data.obj).obj pulled in for symbol Metadata::Metadata...\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e        common.lib(content_message_generator.obj)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ecommon.lib(content_message_generator.obj).obj pulled in for symbol ...\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e        Command-line obj file: url_loader.mojom.obj\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\"\"\"\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eIn this case this tells us that drop_data.obj is being pulled in indirectly through a chain of references that starts with url_loader.mojom.obj. \u003cspan style\u003d\"font-size:13.3333px\"\u003eurl_loader.mojom.\u003c/span\u003eobj is in a source_set which means that it is on the command-line. I then change the source_set to a static_library and redo the steps. If all goes well then the unwanted .obj file will eventually stop being pulled in and I can use pe_summarize.py to measure the savings, and ShowGlobals to look for the next large global variable.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eSometimes this technique - of changing source_set to static_library - doesn’t help. In those case it can be important to figure out follow the chain of symbols and see if it can be broken. In one case (\u003ca href\u003d\"https://codereview.chromium.org/2559063002\"\u003ecrrev.com/2559063002\u003c/a\u003e) SkGeometry.obj (skia) was pulling in PeriodicWave.obj (Blink) because of log2f. Investigation showed that SkGeometry.obj referenced the math.h function log2f, while PeriodicWave.obj defined it as an inline function. The chain was broken by not defining log2f as an inline function (letting math.h do that) and a significant amount of code size was saved.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eNote that some size regressions only happen with certain build configurations. Ideally all testing would be done with PGO builds, but that is unwieldy, so release (non-component?) builds are probably the best starting point. If a size regression reproes on this configuration then investigate there and fix it. But, it is advisable to verify the fix on a full official build - with both is_official_build and full_wpo_on_official set to true. Failing to do this test can lead to a fix that doesn’t actually help on the builds that we ship to customers, and this can go unnoticed for months.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eSee crrev.com/2556603002 for an example of using this technique. In this case it was sufficient to change a single source_set to a static_library. The size savings of 900 KB was verified using:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"font-size:13.3333px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u0026gt; python pe_summarize.py out\\release\\chrome.dll size_reduction\\chrome.dll\u003c/div\u003e\u003cdiv\u003eSize of out\\release\\chrome.dll is 42.127872 MB\u003c/div\u003e\u003cdiv\u003e      name:   mem size  ,  disk size\u003c/div\u003e\u003cdiv\u003e     .text: 33.900375 MB\u003c/div\u003e\u003cdiv\u003e    .rdata:  6.325718 MB\u003c/div\u003e\u003cdiv\u003e     .data:  0.718696 MB,  0.274944 MB\u003c/div\u003e\u003cdiv\u003e      .tls:  0.000025 MB\u003c/div\u003e\u003cdiv\u003e  CPADinfo:  0.000036 MB\u003c/div\u003e\u003cdiv\u003e   .rodata:  0.003216 MB\u003c/div\u003e\u003cdiv\u003e  .crthunk:  0.000064 MB\u003c/div\u003e\u003cdiv\u003e    .gfids:  0.001052 MB\u003c/div\u003e\u003cdiv\u003e    _RDATA:  0.000288 MB\u003c/div\u003e\u003cdiv\u003e     .rsrc:  0.175088 MB\u003c/div\u003e\u003cdiv\u003e    .reloc:  1.443124 MB\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSize of size_reduction\\chrome.dll is 41.211392 MB\u003c/div\u003e\u003cdiv\u003e      name:   mem size  ,  disk size\u003c/div\u003e\u003cdiv\u003e     .text: 33.188599 MB\u003c/div\u003e\u003cdiv\u003e    .rdata:  6.164966 MB\u003c/div\u003e\u003cdiv\u003e     .data:  0.707848 MB,  0.264704 MB\u003c/div\u003e\u003cdiv\u003e      .tls:  0.000025 MB\u003c/div\u003e\u003cdiv\u003e  CPADinfo:  0.000036 MB\u003c/div\u003e\u003cdiv\u003e   .rodata:  0.003216 MB\u003c/div\u003e\u003cdiv\u003e  .crthunk:  0.000064 MB\u003c/div\u003e\u003cdiv\u003e    .gfids:  0.001052 MB\u003c/div\u003e\u003cdiv\u003e    _RDATA:  0.000288 MB\u003c/div\u003e\u003cdiv\u003e     .rsrc:  0.175088 MB\u003c/div\u003e\u003cdiv\u003e    .reloc:  1.409388 MB\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChange from out\\release\\chrome.dll to size_reduction\\chrome.dll\u003c/div\u003e\u003cdiv\u003e     .text: -711776 bytes change\u003c/div\u003e\u003cdiv\u003e    .rdata: -160752 bytes change\u003c/div\u003e\u003cdiv\u003e     .data: -10848 bytes change\u003c/div\u003e\u003cdiv\u003e    .reloc: -33736 bytes change\u003c/div\u003e\u003cdiv\u003eTotal change: -917112 bytes\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/windows-binary-sizes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1273642415345641600"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273642415345641600"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273642415345641600"}],"author":[{"name":{"$t":"Bruce Dawson"},"email":{"$t":"brucedawson@chromium.org"}}],"sites$pageName":{"$t":"windows-binary-sizes"},"sites$revision":{"$t":"19"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4704550565915827704"},"published":{"$t":"2009-07-27T21:32:55.397Z"},"updated":{"$t":"2019-10-24T18:49:24.157Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-24T18:49:20.255Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Page Heap for Chromium"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003ePage Heap is a Windows mode to help identify memory errors, including those in third-party or OS supplied code. Application Verifier is a Windows mode that can detect additional programming errors.\u003c/p\u003e\u003cp\u003eNote that until crbug.com/1004989 is fixed you may need to add --disable-features\u003dRendererCodeIntegrity to avoid sandbox crashes in renderer processes when using pageheap. See also \u003ca href\u003d\"https://www.chromium.org/developers/how-tos/debugging-on-windows\"\u003ethis page\u003c/a\u003e for information on Application Verifier.\u003c/p\u003e\r\n\r\n\u003ch3 style\u003d\"color:rgb(85,85,85);font-family:sans-serif\"\u003e\u003ca name\u003d\"TOC-Enabling-Page-Heap\" /\u003eEnabling Page Heap\u003c/h3\u003e\r\n\u003cp\u003e1. One way of enabling page heap is using \u003ca href\u003d\"https://randomascii.wordpress.com/2011/12/07/increased-reliability-through-more-crashes/\" rel\u003d\"nofollow\"\u003eApplication Verifier\u003c/a\u003e (comes with the Windows Platform SDK, use X64 or WOW versions), which enables full page heap and also enables other checks. If you run Application Verifier (requires Chrome 68.0.3406.0 or later) you can enable the checks for chrome by using File-\u0026gt; Add Application to add chrome.exe. Then open the Basics section and uncheck \u003ci\u003eLeak\u003c/i\u003e, to avoid known failures that do not indicate problems we want to fix (see crbug.com/807500 for details). You may also need to disable \u003ci\u003eHandles\u003c/i\u003e and \u003ci\u003eLocks\u003c/i\u003e depending on your graphics driver and specific Chrome version.\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eFor some builds (debug builds for sure) it is necessary to disable Basics-\u0026gt; TLS due to aggressive TLS index range-checking done by v8.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eAfter adjusting these settings be sure to hit Save. Note that all chrome.exe process launches will be affected so you may want to shut down stable Chrome while testing to avoid confusing problems.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ePage heap should always be used with a 64-bit version of Chrome to avoid address space exhaustion - every allocation takes a minimum of 4 KB of memory and at least 8 KB of address space.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e2. Another way to turn on page heap is using gflags, which is included in Windows Debugging Tools.It comes with the Debuggers package in the Windows SDK. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you're a Googler and use the depot_tools toolchain, there's a version in \"\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003edepot_tools\\win_toolchain\\vs_files\\\u0026lt;hash\u0026gt;\\win_sdk\\Debuggers\\x64\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\".\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eOr a\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003edd the SDK's Windows Debugging Tools to your path: \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"c:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\"\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e3. Enable full page heap for a particular executable with this command:\u003c/p\u003e\r\n\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em;overflow-x:auto;overflow-y:auto\"\u003egflags.exe /p /enable chrome.exe /full\r\n\u003c/pre\u003e\r\n\u003cp\u003eThis method doesn't seem to work anymore - it just says \"No application has page heap enabled.\" and does nothing, so run gflags.exe and let the UI come up. Or use Application Verifier.\u003c/p\u003e\u003cp\u003eIf chrome gets too slow with full page heap turned on, you can enable it with normal page heap:\u003c/p\u003e\r\n\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em;overflow-x:auto;overflow-y:auto\"\u003egflags.exe /p /enable chrome.exe\u003c/pre\u003e\r\n\u003cp\u003eTip: since you need to run this as administrator, it might be easiest if you right-click on your console program and select Run as administrator so that all operations in that shell are already privileged.\u003c/p\u003e\u003cp\u003eSee Background section for more information on page heap and gflags.\u003c/p\u003e\u003ch3 style\u003d\"color:rgb(85,85,85);font-family:sans-serif\"\u003e\u003ca name\u003d\"Disabling_Page_Heap\" /\u003eDisabling Page Heap\u003c/h3\u003e\r\n\u003cp\u003eTo disable page heap when you're done, run:\u003c/p\u003e\r\n\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em;overflow-x:auto;overflow-y:auto\"\u003egflags.exe /p /disable chrome.exe\r\n\u003c/pre\u003e\r\n\r\n\u003ch3 style\u003d\"color:rgb(85,85,85);font-family:sans-serif\"\u003e\u003ca name\u003d\"Background\" /\u003eBackground\u003c/h3\u003e\r\n\u003cp\u003e1. Page heap is Window built-in support for heap verification. There are two modes:\u003c/p\u003e\r\n\u003cp\u003e- Full-Page heap places a non-accessible page at the end of the allocation. Full-page heap has high memory requirements. Its advantage is that a process will access violate (AV) exactly at the point of illegal memory operation.\u003c/p\u003e\r\n\u003cp\u003e- Normal page heap checks fill patterns when the block gets freed. Normal page heap can be used for testing large-scale process without the high memory consumption overhead of full-page heap. However, normal page heap delays detection until the blocks are freed - thus failures are more difficult to debug.\u003c/p\u003e\r\n\u003cp\u003eWhen an application foo.exe is launched, Windows looks up in \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\foo.exe\" for page heap and other settings of the executable and acts accordingly.\u003c/p\u003e\r\n\u003cp\u003e2. To turn on page heap for an executable, one just needs to modify the settings in registry. Gflags is a utility downloadable from Microsoft to edit settings under \"Image File Execution Options\".\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Troubleshooting\" /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ch3 style\u003d\"color:rgb(85,85,85);font-family:sans-serif\"\u003e\u003ca name\u003d\"TOC-Troubleshooting1\" /\u003eTroubleshooting\u003c/h3\u003e\u003c/span\u003e\u003c/h3\u003e\u003cul\u003e\u003cli\u003eAre you sure you're using the 32-bit version of gflags? If you use the 64-bit version, you won't get any error messages, but nothing will happen.\u003c/li\u003e\u003cli\u003eAre you sure you're using a 64-bit build of Chrome? The 32-bit version will run out of address space and spuriously fail with full page heap.\u003c/li\u003e\u003cli\u003eAre you debugging browser_tests? You might want to enable page heap for both browser_tests.exe and chrome.exe, or try running browser_tests with the --single-process flag.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/page-heap-for-chrome"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4704550565915827704"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4704550565915827704"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4704550565915827704"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$pageName":{"$t":"page-heap-for-chrome"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/798998611826989153"},"published":{"$t":"2010-11-08T16:06:27.268Z"},"updated":{"$t":"2019-10-22T22:21:19.728Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-22T22:21:16.927Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Security Brag Sheet"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Our-Team-and-Resources\" /\u003e\u003cfont size\u003d\"3\"\u003eOur Team and Resources\u003c/font\u003e\u003cbr /\u003e\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eOur team includes some of the best security professionals in the business.\u003c/li\u003e\u003cli\u003eWe work closely with top researchers like Michal Zalewski (lcamtuf) and Tavis Ormandy (taviso).\u003c/li\u003e\u003cli\u003eWe contract with experts like iSec Partners and Chris Rohlf for targeted assessments.\u003c/li\u003e\u003cli\u003eWe dedicate thousands of CPU cores to fuzz projects such as \u003ca href\u003d\"http://blog.chromium.org/2012/04/fuzzing-for-security.html\"\u003eWebKit\u003c/a\u003e, \u003ca href\u003d\"http://googleonlinesecurity.blogspot.com/2011/08/fuzzing-at-scale.html\" rel\u003d\"nofollow\"\u003eAdobe Flash\u003c/a\u003e or \u003ca href\u003d\"http://j00ru.vexillium.org/?p\u003d1175\" rel\u003d\"nofollow\"\u003eChrome's PDF viewer\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eWhite Papers\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eChrome leads in \u003ca href\u003d\"https://www.blog.google/products/chrome-enterprise/2-new-white-papers-examine-enterprise-web-browser-security/\" target\u003d\"_blank\"\u003ewhite papers from 2 different security firms\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eChrome leads in \u003ca href\u003d\"http://www.accuvant.com/sites/default/files/AccuvantBrowserSecCompar_FINAL.pdf\" rel\u003d\"nofollow\"\u003ewhite paper from respected security firm Accuvant\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eChrome leads in response time and reward program effectiveness in \u003ca href\u003d\"https://www.usenix.org/system/files/conference/usenixsecurity13/sec13-paper_finifter.pdf\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003ethis independent study from Berkeley\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003eChrome leads in \u003ca href\u003d\"https://www.bsi-fuer-buerger.de/SharedDocs/Downloads/DE/BSIFB/Publikationen/BSI-E-CS_001.pdf\" rel\u003d\"nofollow\" style\u003d\"color:rgb(17,85,204);font-family:Arial,sans-serif;font-size:13px\"\u003erecommendations from respected German government organization, the BSI\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Containing-Attacks\" /\u003e\u003cfont size\u003d\"3\"\u003eContaining Attacks\u003c/font\u003e\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eWe have an \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/guts\" target\u003d\"_blank\"\u003eintegrated sandbox\u003c/a\u003e that reduces the impact of most common vulnerabilities, and is much stronger than approaches used by other browsers.\u003c/li\u003e\u003cli\u003eWe have \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation\"\u003eSite Isolation\u003c/a\u003e to protect website data from compromised renderer processes and side channel attacks like Spectre.\u003c/li\u003e\r\n\u003cli\u003eWe have \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/severity-guidelines\"\u003ecritical\u003c/a\u003e security vulnerabilities relatively infrequently compared to other browsers.\u003c/li\u003e\u003cli\u003eWe have \u003ca href\u003d\"http://blog.chromium.org/2012/08/the-road-to-safer-more-stable-and.html\"\u003eleading sandbox protection for the Adobe Flash plug-in\u003c/a\u003e.\u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003eWe have \u003ca href\u003d\"http://blog.chromium.org/2010/06/improving-plug-in-security.html\"\u003eunique techniques\u003c/a\u003e for significantly mitigating the security risks posed by plug-ins.\u003c/li\u003e\r\n\u003cli\u003eWe have a robust built-in \u003ca href\u003d\"http://chrome.blogspot.com/2010/11/pdf-goodness-in-chrome.html\" rel\u003d\"nofollow\"\u003esandboxed PDF viewer\u003c/a\u003e which has leading security.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eWe implement \u003ca href\u003d\"https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eStrict Transport Security\u003c/a\u003e and \u003ca href\u003d\"http://www.imperialviolet.org/2011/05/04/pinning.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003epreloaded public key pinning\u003c/a\u003e, which protected our users against the \u003ca href\u003d\"https://blog.mozilla.com/security/2011/08/29/fraudulent-google-com-certificate/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003efraudulent Diginotar certificate\u003c/a\u003e for *.google.com.\u003c/li\u003e\u003cli\u003eWe implement \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/root-ca-policy\"\u003eroot CA verification by the underlying operating system\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eWe have leading HTTPS security through features such as \u003ca href\u003d\"http://blog.chromium.org/2012/08/ending-mixed-scripting-vulnerabilities.html\"\u003emixed script blocking\u003c/a\u003e.\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Vulnerability-Response\" /\u003e\u003cfont size\u003d\"3\"\u003eVulnerability Response \u003c/font\u003e\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eWe are committed to releasing a fix for any \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/severity-guidelines\"\u003ecritical\u003c/a\u003e security vulnerabilities in \u003ca href\u003d\"http://googleonlinesecurity.blogspot.com/2010/07/rebooting-responsible-disclosure-focus.html\" rel\u003d\"nofollow\"\u003eunder 60 days\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eOn average, we release fixes for \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/severity-guidelines\"\u003ehigh and critical\u003c/a\u003e severity vulnerabilities in about 30 days.\u003c/li\u003e\u003cli\u003eWe have a demonstrated ability to get fixes to users \u003ca href\u003d\"http://googlechromereleases.blogspot.com/2011/03/stable-and-beta-channel-updates.html\" rel\u003d\"nofollow\"\u003ein under\u003c/a\u003e \u003ca href\u003d\"http://twitter.com/VUPEN/status/46391969903161345\" rel\u003d\"nofollow\"\u003e24 hours\u003c/a\u003e.  \u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003eWe ensure updates are deployed in a \u003ca href\u003d\"http://www.techzoom.net/publications/silent-updates/\" rel\u003d\"nofollow\"\u003etimely manner\u003c/a\u003e, and invest in \u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/software-updates-courgette\"\u003enew technologies\u003c/a\u003e to do so.\u003c/li\u003e\r\n\u003cli\u003eWe have a \u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/vulnerability-rewards-program\"\u003eVulnerability Rewards Program\u003c/a\u003e to encourage third-party researchers to report vulnerabilities they discover.\u003c/li\u003e\r\n\u003cli\u003eWe work with the security community and have a \u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/hall-of-fame\"\u003eSecurity Hall of Fame\u003c/a\u003e to acknowledge third-parties that materially contribute to improving our security.\u003c/li\u003e\u003cli\u003eWe have the \u003ca href\u003d\"http://chrome.blogspot.com/2012/03/pwnium-great-exploits-fast-patches.html\" rel\u003d\"nofollow\"\u003esuccessful Pwnium competition\u003c/a\u003e, with large prizes, to keep us up to date with the latest, most advanced attacks.\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Advanced-Anti--Phishing-and-Malware-defenses\" /\u003e\u003cfont size\u003d\"3\"\u003eAdvanced Anti- Phishing and Malware defenses\u003c/font\u003e\u003cbr /\u003e\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eWe \u003ca href\u003d\"http://www.google.com/support/chrome/bin/answer.py?answer\u003d99020\u0026amp;hl\u003den\"\u003ewarn you\u003c/a\u003e when you're about to visit a website we've previously identify as a malware or phishing site. \u003c/li\u003e\r\n\u003cli\u003eWe keep the user better informed against phishing and similar attacks by \u003ca href\u003d\"http://chrome.blogspot.com/2010/10/understanding-omnibox-for-better.html\" rel\u003d\"nofollow\"\u003epresenting the most relevant information\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eWe implement new, \u003ca href\u003d\"http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html\"\u003ebrowser-based security enhancements\u003c/a\u003e to protect you against malicious sites.\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-High-profile-researchers-and-publications-say-nice-things-about-us\" /\u003e\u003cfont size\u003d\"3\"\u003eHigh profile researchers and publications say nice things about us \u003c/font\u003e\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eA \u003ca href\u003d\"http://tech.fortune.cnn.com/2011/03/21/google-fixes-flashs-security-issues-ahead-of-adobe/?utm_source\u003dfeedburner\u0026amp;utm_medium\u003dfeed\u0026amp;utm_campaign\u003dFeed%3A+fortunebrainstormtech+%28Fortune+Brainstorm+Tech%29\" rel\u003d\"nofollow\"\u003eFortune article's\u003c/a\u003e headline subtext: \"Google's record on Chrome browser security is impressive, and that is important.\"\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eAn \u003ca href\u003d\"http://www.h-online.com/security/features/Hackers-versus-Apple-1202598.html\" rel\u003d\"nofollow\"\u003einterview with Dino Dai Zovi and Charlie Miller\u003c/a\u003e: \"I recommend that users surf the web with Google Chrome, disable \r\nunnecessary plug-ins, and use site-based plug-in security settings for \r\nthe plug-ins that they do need.\"\u003c/li\u003e\u003cli\u003eAn article noting \u003ca href\u003d\"http://www.computerworld.com/s/article/9214022/Google_s_Chrome_untouched_at_Pwn2Own_hack_match\" rel\u003d\"nofollow\"\u003eChrome's unique 3-years-in-a-row survival\u003c/a\u003e at the Pwn2Own competition: \"the browser will have survived three consecutive Pwn2Owns, a record.\"\u003c/li\u003e\u003cli\u003eAn article \u003ca href\u003d\"http://www.h-online.com/security/news/item/Google-closes-Flash-hole-faster-than-Adobe-1209932.html\" rel\u003d\"nofollow\"\u003enoting our agility and fast security updates\u003c/a\u003e: \"Google has once again reacted faster than Adobe itself\"\u003c/li\u003e\u003cli\u003eA more mainstream publication \u003ca href\u003d\"http://content.usatoday.com/communities/technologylive/post/2011/03/20-grand-not-enough-to-entice-hackers-to-crack-google-chrome/1\" rel\u003d\"nofollow\"\u003einterviews HD Moore\u003c/a\u003e, who calls Chrome the toughest browser: \"Chrome was likely the most difficult target due to the extensive sandboxing.\"\u003c/li\u003e\u003cli\u003eAn \u003ca href\u003d\"http://www.washingtonpost.com/business/apples-taking-30-percent-of-app-store-subscriptions-is-an-unkind-cut/2011/02/14/ABbMfvH_story.html\" rel\u003d\"nofollow\"\u003earticle in the very mainstream Washington Post\u003c/a\u003e notes that whilst other browsers are starting to chase Chrome's speed, Chrome is still the choice of the security conscious: \"Both IE 9 and Firefox 4 look like major, welcome advances. But each falls short of Chrome in one key aspect: security.\"\u003c/li\u003e\u003cli\u003eA \u003ca href\u003d\"http://techland.time.com/2011/03/14/pwn2own-roundup-apple-fails-google-stays-strong/\" rel\u003d\"nofollow\"\u003eTIME article's\u003c/a\u003e headline includes: \"Google Stays Strong\"\u003c/li\u003e\u003cli\u003eAn \u003ca href\u003d\"http://www.securityvibes.com/community/en/blog/2011/03/25/firefox-4-and-the-state-of-browser-security--the-expert-view\" rel\u003d\"nofollow\"\u003einteresting interview with John Wilandar and Chaouki Bekrar\u003c/a\u003e (VUPEN CEO). The interview is nominally about Firefox 4 but includes quotes such as \"I'd say Chrome's sandboxing model still beats all the other browsers from an end user perspective.\", \"At VUPEN, we measure the security of web browsers not by counting the number of their vulnerabilities, but by counting the number of days, weeks, or months that the vendor is taking to fix vulnerabilities affecting their browsers... Today, Google is fixing Chrome vulnerabilities much faster than any other vendor – usually one or two security updates each month. Microsoft, Mozilla, and Apple are are usually releasing security updates for their browsers every 3 months, which is too long.\", \"Relying on third-party auditor through reward and bounty programs is the most effective way to improve the security of browsers\".\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/brag-sheet"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/798998611826989153"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798998611826989153"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798998611826989153"}],"author":[{"name":{"$t":"Justin Schuh"},"email":{"$t":"jschuh@chromium.org"}}],"sites$pageName":{"$t":"brag-sheet"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"Xyl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"},"published":{"$t":"2013-04-02T18:25:30.843Z"},"updated":{"$t":"2019-10-17T05:43:15.698Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-17T05:43:13.209Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Out-of-Process iframes (OOPIFs)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThis page provides an overview of Chromium's support for out-of-process iframes (OOPIFs), which allow a child frame of a page to be rendered by a different process than its parent frame. OOPIFs were motivated by security goals like the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation\"\u003eSite Isolation\u003c/a\u003e project, since they allow a renderer process to be dedicated to a single web site, even when cross-site iframes are present.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:13.3333px;white-space:pre-wrap\"\u003e  OOPIFs are a general mechanism, though, and can be used for other features than security (e.g., the \u0026lt;webview\u0026gt; tag in Chrome Apps).\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eSupporting OOPIFs required a large architecture change to Chromium.  At a high level, the browser process now tracks subframes directly, and core parts of the browser (e.g., painting, input events, navigation, etc) have been updated to support OOPIFs.  Many other features in Chromium now combine information from frames in multiple processes when operating on a page, such as Accessibility or Find-in-Page.\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Status\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eStatus\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Current-Uses\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eCurrent Uses\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Project-Resources\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eProject Resources\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Architecture-Overview\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eArchitecture Overview\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Frame-Representation\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eFrame Representation\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Proxies\"\u003e\u003cstrong\u003e2.1.1 \u003c/strong\u003eProxies\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Browser-Process\"\u003e\u003cstrong\u003e2.1.2 \u003c/strong\u003eBrowser Process\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Renderer-Process\"\u003e\u003cstrong\u003e2.1.3 \u003c/strong\u003eRenderer Process\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Inside-Blink\"\u003e\u003cstrong\u003e2.1.4 \u003c/strong\u003eInside Blink\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Navigation\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eNavigation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Rendering\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eRendering\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Input-Events\"\u003e\u003cstrong\u003e2.4 \u003c/strong\u003eInput Events\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Status\" /\u003eStatus\u003c/h2\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Current-Uses\" /\u003eCurrent Uses\u003c/h3\u003e\u003cdiv\u003eThe first use of OOPIFs was \u003cfont face\u003d\"courier new, monospace\"\u003e--isolate-extensions\u003c/font\u003e mode, which launched to Chrome Stable in M56.  This mode used OOPIFs to keep web iframes out of privileged extension processes, which offered a second line of defense against malicious web iframes that might try to compromise an extension process to gain access to extension APIs.  This mode also moved extension iframes on web pages into extension processes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe enabled OOPIFs in general web pages when launching Site Isolation (for all sites) on desktop in M67.  The first uses on Android launched in M77, to enable Site Isolation for sites that users log into.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBeyond Site Isolation, OOPIFs have been used for a number of Chrome architectural features.  They have replaced the plugin infrastructure for implementing GuestViews, such as the \u0026lt;webview\u0026gt; tag in Chrome Apps.  They have also replaced plugin code for MimeHandlerView, which is how PDFs and some other data types are rendered.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eFor any issues observed in these uses of OOPIFs, please file a bug in the component \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?q\u003dcomponent:Internals%3ESandbox%3ESiteIsolation\"\u003eInternals\u0026gt;Sandbox\u0026gt;SiteIsolation\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Project-Resources\" /\u003eProject Resources\u003c/h3\u003e\u003cdiv\u003e\u003cspan\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://csreis.github.io/oop-iframe-dependencies/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eTask Dependency Diagram\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e - A visualization of the bugs and tasks that need to be completed for each upcoming milestone. (Out of date.)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?q\u003dcomponent:Internals%3ESandbox%3ESiteIsolation\" style\u003d\"font-size:13.3333px;line-height:normal;white-space:pre-wrap;background-color:transparent\"\u003eInternals\u0026gt;Sandbox\u0026gt;SiteIsolation\u003c/a\u003e - \u003cspan style\u003d\"line-height:1.38;font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eAll known bugs with OOPIFs and Site Isolation in general.  The overall tracking bug for OOPIFs is \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/99379\" style\u003d\"line-height:1.38;font-size:13.3333px;text-decoration:none;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://crbug.com/99379\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"line-height:1.38;font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e, and the launch is tracked at \u003ca href\u003d\"https://crbug.com/545200\"\u003ehttps://crbug.com/545200\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003eBots using --site-per-process: \u003c/span\u003e\u003ca href\u003d\"http://build.chromium.org/p/chromium.fyi/builders/Site%20Isolation%20Linux\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eFYI Linux\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"http://build.chromium.org/p/chromium.fyi/builders/Site%20Isolation%20Win\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eFYI Windows\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_site_isolation\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003elinux_site_isolation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e try bot\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1Iqe_CzFVA6hyxe7h2bUKusxsjB6frXfdAYLerM3JjPo/edit?usp\u003dsharing\" style\u003d\"font-size:13.3333px;background-color:transparent;text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eFeature Update FAQ\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e - General information for how to update Chromium features to be compatible with OOPIFs.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1dCR2aEoBJj_Yqcs6GuM7lUPr0gag77L5OSgDa8bebsI/edit?usp\u003dsharing\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected Feature List\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e - The set of Chromium features we know are affected by OOPIFs.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/site-isolation#TOC-2015-Site-Isolation-Summit-Talks\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSite Isolation Summit talks\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e - A set of slides and videos covering the changes to Chromium's architecture and how features can be updated.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13.3333px;font-family:Arial;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003eMailing list: \u003c/span\u003e\u003cspan style\u003d\"text-decoration:underline;font-size:13.3333px;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/site-isolation-dev\" style\u003d\"text-decoration:none\"\u003esite-isolation-dev@chromium.org\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Architecture-Overview\" /\u003eArchitecture Overview\u003c/h2\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Frame-Representation\" /\u003eFrame Representation\u003c/h3\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eMuch of the logic in the \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/content-module\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003econtent module\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e has moved from being tab-specific to frame-specific, since each frame may be rendered in different processes over its lifetime.\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Proxies\" /\u003eProxies\u003c/h4\u003e\u003cdiv style\u003d\"font-size:10pt\" /\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:inline;margin:5px 10px;float:right\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Cross%20Process%20Tabs%20%28for%20posting%29.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"329\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1366228626421/developers/design-documents/oop-iframes/Cross%20Process%20Tabs%20%28for%20posting%29.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDocuments that have references to each other (e.g., from the frame tree, window.opener, or named windows) can interact via JavaScript.  When the documents are same-site, they must live in the same process to allow synchronous access.  When they are cross-site, they can live in different processes but need a way to route messages to each other, for calls like postMessage.  Same-site documents with references to each other are grouped together using the SiteInstance class, as described on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/process-models\"\u003eProcess Models\u003c/a\u003e page.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTo support cross-process interactions like postMessage on a document's DOMWindow, Chromium must keep a proxy for the DOMWindow in each of the other processes that can reach it.  As shown in the diagram at right, this allows a document from site A to find a proxy in its own process for a DOMWindow that is currently active on site B.  The proxy can then forward the postMessage call to the browser and then to the correct document in the process for site B.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOOPIFs require each renderer process to keep track of proxy DOMWindows for all reachable frames, both main frames and subframes.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Browser-Process\" /\u003eBrowser Process\u003c/h4\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium keeps track of the full frame tree for each tab in the browser process.  WebContents hosts a tree of FrameTreeNode objects, mirroring the frame tree of the current page.  Each FrameTreeNode contains frame-specific information (e.g., the frame's name, origin, etc).  Its RenderFrameHostManager is responsible for cross-process navigations in the frame, and it supports replicating state and routing messages from proxies in other processes to the active frame.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Renderer-Process\" /\u003eRenderer Process\u003c/h4\u003e\u003cdiv\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIn each renderer process, Chromium tracks of proxy DOMWindows for each reachable frame, allowing JavaScript code to find frames and send messages to them.  We try to minimize the overhead for each of the proxy DOMWindows by not having a document, widget, or full V8 context for them.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eFrame-specific logic in the content module's RenderView and RenderViewHost classes has moved into routable RenderFrame and RenderFrameHost classes.  We have one full RenderFrame (in some process) for every frame in a page, and we have a corresponding but slimmed down RenderFrameProxy as a placeholder in the other processes that can reference it.  These proxies are shown with dashed lines in the diagram below, which depicts one BrowsingInstance (i.e., group of related windows) with two tabs, containing two subframes each.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Frame%20Trees%202015%20%28for%20posting%29.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1445448026552/developers/design-documents/oop-iframes/Frame%20Trees%202015%20%28for%20posting%29.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Inside-Blink\" /\u003eInside Blink\u003c/h4\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cdiv /\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cdiv /\u003e\u003cdiv style\u003d\"display:inline;float:right;margin:5px 10px\" /\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv style\u003d\"display:inline;margin:5px 10px;float:right\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Frame%20DOMWindow%20Document%202015%20%28for%20posting%29.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1445448006392/developers/design-documents/oop-iframes/Frame%20DOMWindow%20Document%202015%20%28for%20posting%29.png\" /\u003e\u003c/a\u003e\u003c/div\u003eBlink has LocalFrame and LocalDOMWindow classes for frames that are in-process, and it has RemoteFrame and RemoteDOMWindow classes for the proxies that live in other renderer processes.  The remote classes have very little state: generally only what is needed to service synchronous operations.  A RemoteDOMWindow does not have a Document object or a widget.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eLocalFrame and RemoteFrame inherit from the Frame interface.  While downcasts from Frame to LocalFrame are possible, this will likely cause bugs with OOPIFs unless extra care is taken.  LocalFrame corresponds to WebLocalFrame (in the public API) and content::RenderFrame, while RemoteFrame corresponds to WebRemoteFrame and content::RenderFrameProxy.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eBlink has the ability to swap any frame between the local and remote versions.  (This replaces the old \"swapped out RenderViewHost\" implementation that Chromium used for cross-process navigations.)\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIt is worth noting that the \u003c/span\u003e\u003ca href\u003d\"https://developer.chrome.com/apps/tags/webview\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;color:rgb(71,18,100);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;webview\u0026gt;\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e implementation is being migrated to work on top of the new OOPIF infrastructure. For the most part, Blink code will be able to treat a \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;webview\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e similar to an \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;iframe\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHowever, there is one important difference: the parent frame of an \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;iframe\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e is the document that contains the \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;iframe\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e element, while the root frame of a \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;webview\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e has \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eno\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e parent and is itself a main frame.  It will likely live in a separate frame tree.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThis support for OOPIFs and \u0026lt;webview\u0026gt; has several major implications for Blink:\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ePage\u003c/font\u003e's main frame may be local \u003cb\u003eor\u003c/b\u003e remote. \u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are a number of places that assume that main frame will always be local (e.g., the current drag and drop implementation always uses the main frame's event handler to perform hit-testing). These places will need to change.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eMore generally, \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eany\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e given frame in the frame tree may be remote. Thus, we are rewriting code like the web page serializer, which depended on iterating through all the frames in one process to generate the saved web page.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eLayout and rendering were formerly coordinated by the main frame. This (and other code like this) needs to change to use a new concept: the \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003elocal frame root\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. The local frame root for a given \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eLocalFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e A is the highest \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eLocalFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e that is a part of a contiguous \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eLocalFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e subtree that includes frame A. In code form:\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    LocalFrame* localRootFor(LocalFrame* frame) {\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e        LocalFrame* local_root \u003d frame;\u003cbr /\u003e        while (local_root \u0026amp;\u0026amp; local_root-\u0026gt;parent()-\u0026gt;isLocalFrame())\u003cbr /\u003e            local_root \u003d toLocalFrame(local_root-\u0026gt;parent());\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003e        return local_root;\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    }\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThese contiguous \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eLocalFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e subtrees are important in Blink because they synchronously handle layout, painting, event routing, etc.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eSome earlier information on the refactoring goals can be found in the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/framehandle\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eFrameHandle design doc\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e, however that is largely obsolete.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eNote: We are attempting to minimize the memory requirements of RemoteFrames and RemoteDOMWindows, because there will be many more than in Chromium before OOPIFs.  Before, the space required for swapped out RenderViewHosts was O(tabs * processes) within a BrowsingInstance, and most BrowsingInstances only contain 1 or 2 tabs.  OOPIFs will require O(frames * processes) space for proxies.  This could be much higher, because the number of frames can be much larger than the number of tabs, and because the number of processes will increase based on cross-site frames.  Fortunately, RemoteFrames require far less memory than LocalFrames, and not all cross-site iframes will require separate processes.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Navigation\" /\u003eNavigation\u003c/h3\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium now has support for cross-process navigations within subframes\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. Rather than letting the renderer process intercept the navigation and decide if the browser process should handle it, all navigations are intercepted in the browser process's network stack. If the navigation crosses a site boundary that requires isolation (according to our Site Isolation policy), the browser process will swap the frame's renderer process. This can be done because the browser process knows the full frame tree, as described above. Until \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1cSW8fpJIUnibQKU8TMwLE5VxYZPh4u4LNu_wtkok8UE/edit?usp\u003dsharing\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ePlzNavigate\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e launched, this was implemented using CrossSiteResourceHandler to transfer navigations to a different process when needed.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eA tab's session history also becomes more complicated when subframes may be rendered by different processes. Originally, Blink took care of tracking the frame tree in each HistoryItem in the renderer process, and the browser process just tracked each back/forward entry using NavigationEntry. We removed the frame tracking logic from Blink's HistoryController to keep track of each frame's navigations in the browser process directly.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWe also changed the representation of a tab's session history to more closely match the HTML5 spec. Rather than cloning the frame tree for each HistoryItem, we now keep track of each frame's session history separately in the browser process, and we use a separate \"joint session history\" list for back and forward navigations. Each entry in this list will have a tree of pointers to each frame's corresponding session history item.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAll details of navigation refactoring were described in this \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1Z-24Xmb5A00eMSfaBB5MQLTrp9LQ5hm3GKMfpFi44fQ/edit\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(71,18,100);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003edesign document\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Rendering\" /\u003eRendering\u003c/h3\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTo render an iframe in a different process than its parent frame, the browser process passes information back and forth between the renderer processes and helps the GPU process composite the images together in the correct sizes and locations.  We use the \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/chromium-graphics/surfaces\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(71,18,100);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSurfaces\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e implementation to maintain a set of textures from multiple renderer processes, compositing them into a single output image.  More details are available in this \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/oop-iframes/oop-iframes-rendering\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(71,18,100);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003edesign document\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Input-Events\" /\u003eInput Events\u003c/h3\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eSimilar to rendering, we use the \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/chromium-graphics/surfaces\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSurfaces\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e implementation to do hit testing in the browser process to deliver input events directly to the intended frame's renderer process.  We also manage focus in the browser process to send keyboard events directly to the renderer process of the focused frame.  More details are available in this \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1RQUbxiK60Z7CZDcWeryqKeX-bewZzgsirjF2Dprfx3U/edit?usp\u003dsharing\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003edesign document\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2708308332133640550"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"oop-iframes"},"sites$revision":{"$t":"36"}},{"gd$etag":"\"Wil7JmA6\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4179418459408669564"},"published":{"$t":"2012-03-22T02:32:41.355Z"},"updated":{"$t":"2019-10-17T05:18:37.438Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-17T05:18:34.974Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Site Isolation Design Document"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv /\u003e\u003cp\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eThis design document covers technical information about how Site Isolation is built.  \u003c/span\u003eFor a general overview of Site Isolation, see \u003ca href\u003d\"https://www.chromium.org/Home/chromium-security/site-isolation\"\u003ehttps://www.chromium.org/Home/chromium-security/site-isolation\u003c/a\u003e.\u003c/i\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Motivation\" /\u003eMotivation\u003c/h2\u003e\r\n\u003cdiv\u003eChrome's \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture\"\u003emulti-process architecture\u003c/a\u003e provides many benefits for speed, stability, and security.  It allows web pages in unrelated tabs to run in parallel, and it allows users to continue using the browser and other tabs when a renderer process crashes.  Because the renderer processes don't require direct access to disk, network, or devices, Chrome can also run them inside a restricted \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sandbox\"\u003esandbox\u003c/a\u003e.  This \u003ca href\u003d\"http://crypto.stanford.edu/websec/chromium/\" rel\u003d\"nofollow\"\u003elimits the damage\u003c/a\u003e that attackers can cause if they exploit a vulnerability in the renderer, including making it difficult for attackers to access the user's filesystem or devices, as well as privileged pages (e.g., settings or extensions) and pages in other profiles (e.g., Incognito mode).\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"display:inline;float:right;margin-top:5px;margin-right:10px;margin-bottom:5px;margin-left:10px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation/ChromeSiteIsolationProject-arch.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"137\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1332384354611/developers/design-documents/site-isolation/ChromeSiteIsolationProject-arch.png\" width\u003d\"320\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHowever, for a long time there was a large opportunity to use Chrome's sandbox for greater security benefits: isolating web sites from each other.  Until version 67, Chrome made an effort to place pages from different web sites in different renderer processes when possible, but due to compatibility constraints, there were many cases in which pages from different sites share a process (e.g., cross-site iframes).  In these cases, we used to rely on the renderer process to enforce the Same Origin Policy and keep web sites isolated from each other.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis page describes our \"site isolation\" efforts to improve Chrome to use sandboxed renderer processes as a security boundary between web sites, even in the presence of vulnerabilities in the renderer process.  Our goal is to ensure a renderer process can be limited to contain pages from at most one web site.  The browser process can then restrict that process's access to cookies and other resources, based on which web sites require dedicated processes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eStatus:\u003c/b\u003e Site Isolation has been enabled by default on desktop platforms (for all sites) in Chrome 67, and on Android (for sites users log into) in Chrome 77.  This helps defend against speculative side channel attacks (e.g., Spectre), and (on desktop) against UXSS and fully compromised renderer processes.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Motivation\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eMotivation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Threat-Model\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eThreat Model\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Requirements\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eRequirements\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Project-Progression\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eProject Progression\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Project-Tasks\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eProject Tasks\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Performance\"\u003e\u003cstrong\u003e6 \u003c/strong\u003ePerformance\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-Enable\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eHow to Enable\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Development-Resources\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eDevelopment Resources\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-2015-Site-Isolation-Summit-Talks\"\u003e\u003cstrong\u003e9 \u003c/strong\u003e2015 Site Isolation Summit Talks\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Site-Isolation-Overview\"\u003e\u003cstrong\u003e9.1 \u003c/strong\u003eSite Isolation Overview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-Changes-for-OOPIF-\"\u003e\u003cstrong\u003e9.2 \u003c/strong\u003eChromium Changes for OOPIF \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Blink-Changes-for-OOPIF-\"\u003e\u003cstrong\u003e9.3 \u003c/strong\u003eBlink Changes for OOPIF \u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Discussions-Questions\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eDiscussions/Questions\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Threat-Model\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eThreat Model\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\u003cdiv\u003eFor a \"one-site-per-process\" security policy, we assume that an attacker can convince the user to visit a page that exploits a vulnerability in the renderer process, allowing the attacker to run arbitrary code within the sandbox.  We also assume that an attacker may use \u003ca href\u003d\"https://security.googleblog.com/2018/01/todays-cpu-vulnerability-what-you-need.html\"\u003especulative side channel attacks\u003c/a\u003e (e.g., Spectre) to read data within a renderer process.  We focus on attackers that want to steal information or abuse privileges granted to other web sites.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHere, we use a precise definition for a \u003cb\u003esite\u003c/b\u003e that we use as a principal: a page's site includes the scheme and registered domain name, including the public suffix, but ignoring subdomains, port, or path.  We use sites instead of origins to avoid breaking compatibility with existing web pages that might modify their document.domain to communicate across subdomains.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWe consider the following threats in scope for the proposed policy (once fully implemented):\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eStealing cross-site cookies and HTML5 stored data.\u003c/b\u003e  We can prevent a renderer process from receiving cookies or stored data from sites other than its own.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eStealing cross-site HTML, XML, and JSON data.\u003c/b\u003e  Using MIME type and content sniffing, we can prevent a renderer process from loading most sensitive cross-site data.  We cannot block all cross-site resources, however, because images, scripts, and other opaque files are permitted across sites.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eStealing saved passwords.\u003c/b\u003e  We can prevent a renderer process from receiving saved passwords from sites other than its own.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eAbusing permissions granted to another site.\u003c/b\u003e  We can prevent a renderer process from using permissions such as geolocation that the user has granted to other sites.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCompromising X-Frame-Options.\u003c/b\u003e  We can prevent a renderer process from loading cross-site pages in iframes.  This allows the browser process to decide if a given site can be loaded in an iframe or not based on X-Frame-Options or CSP frame-ancestors headers.\u003c/li\u003e\u003cli\u003e\u003cb\u003eAccessing cross-site DOM elements via UXSS bugs.\u003c/b\u003e  An attacker exploiting a universal cross-site scripting bug in the renderer process will not be able to access DOM elements of cross-site pages, which will not live in the same renderer process.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eWe do not expect this policy to mitigate traditional cross-site attacks or attacks that occur within the page of a victim site, such as XSS, CSRF, XSSI, or clickjacking.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Requirements\" /\u003eRequirements\u003c/h2\u003e\r\n\u003cdiv\u003eTo support a site-per-process policy in a multi-process web browser, we need to identify the smallest unit that cannot be split into multiple processes.  This is not actually a single page, but rather a group of documents from the same web site that have references to each other.  Such documents have full script access to each other's content, and they must run on a single thread, not concurrently.  This group may span multiple frames or tabs, and they may come from multiple sub-domains of the same site.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"display:inline;float:left;margin-top:5px;margin-right:10px;margin-bottom:0px;margin-left:0px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation/ChromeSiteIsolationProject-siteinstances.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"150\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1332384488023/developers/design-documents/site-isolation/ChromeSiteIsolationProject-siteinstances.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe HTML spec refers to this group as a \"\u003ca href\u003d\"http://dev.w3.org/html5/spec/single-page.html#unit-of-related-similar-origin-browsing-contexts\" rel\u003d\"nofollow\"\u003eunit of related similar-origin browsing contexts\u003c/a\u003e.\"  In Chrome, we refer to this as a \u003cb\u003eSiteInstance\u003c/b\u003e.  All of the documents within a SiteInstance may be able to script each other, and we must thus render them in the same process.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNote that a single tab might be navigated from one web site to another, and thus it may show different SiteInstances at different times.  To support a site-per-process policy, a browser must be able to swap between renderer processes for these navigations.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThere are also certain JavaScript interactions, such as postMessage() or close(), that are allowed between windows or frames even when they are showing documents from different sites.  It is necessary to support these limited interactions between renderer processes.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIn addition, top-level documents may contain iframes from different web sites.  These iframes have their own security context and must be rendered in a process based on their own site, not the site of their parent frame.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eFinally, it is important that sensitive cross-site data is not delivered to the renderer process, even if requested from contexts like image or script tags which normally work cross-site.  This requires identifying which responses to allow and which to block.\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Project-Progression\" /\u003eProject Progression\u003c/h2\u003e\r\n\u003cdiv\u003eAs described on our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/process-models\"\u003eProcess Models\u003c/a\u003e page, there were originally several cases in which Chrome (prior to version 67) would place documents from different sites in the same renderer process.  This kept Chrome compatible with existing web pages with cross-site iframes, at least until Site Isolation was enabled.  Some examples of cross-site pages that shared a process at the time:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eCross-site iframes were usually hosted in the same process as their parent document.\u003c/li\u003e\r\n\u003cli\u003eMost renderer-initiated navigations (including link clicks, form submissions, and script navigations) were kept within the current process even if they cross a site boundary.  This is because other windows in the same process could attempt to use postMessage or similar calls to interact with them.\u003c/li\u003e\r\n\u003cli\u003eIf too many renderer processes had been created, Chrome started to reuse existing processes rather than creating new ones.  This reduces memory overhead.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHowever, at the time, Chrome already had taken many large steps towards site isolation.  For example, it swapped renderer processes for cross-site navigations that were initiated in the browser process (such as omnibox navigations or bookmarks).  Cross-origin JavaScript interactions were supported across processes, such as postMessage() and navigating another window.  Chrome eventually gained support for out-of-process iframes in some contexts.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThat early progress allowed us to use a stricter security policy for certain types of pages, such as privileged WebUI pages (like the Settings page).  These pages are never allowed to share a process with regular web pages, even when navigating in a single tab.  This is generally acceptable from a compatibility perspective because no scripting is expected between normal pages and WebUI pages, and because these can never be loaded in subframes of unprivileged pages.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAs of Chrome 56, Chrome started using out-of-process iframes to \u003ca href\u003d\"https://blog.chromium.org/2017/05/improving-extension-security-with-out.html\"\u003ekeep web content out of privileged extension processes\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAs of Chrome 63, Site Isolation could be \u003ca href\u003d\"https://support.google.com/chrome/answer/7623121?hl\u003den\"\u003eenabled\u003c/a\u003e as an \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation\"\u003eadditional mitigation against universal cross-site scripting (UXSS) vulnerabilities and Spectre\u003c/a\u003e.  It was also available via\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://www.blog.google/topics/connected-workspaces/security-enhancements-and-more-enterprise-chrome-browser-customers/\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eenterprise policy\u003c/a\u003e.  That initial support was still in progress and had\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/chrome/a/answer/7581529\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eknown issues and tradeoffs\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, but helped to defend against UXSS vulnerabilities and Spectre by putting pages from different sites in different processes to prevent leaks of cross-site data.  The feature did not yet mitigate attacks with arbitrary remote code execution in the renderer process; this will later be possible as additional enforcements in the browser process are completed.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIn Chrome 67, Site Isolation was enabled for all sites on desktop platforms (Windows, Mac, Linux, and ChromeOS), helping to defend against Spectre.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIn Chrome 77, Site Isolation was also enabled on Android devices with at least 2 GB of RAM, but only for sites that users log into (to keep memory overhead lower).  By this time, Site Isolation on desktop (i.e., with the full site-per-process policy) also defended against fully compromised renderer processes.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Project-Tasks\" /\u003eProject Tasks\u003c/h2\u003e\r\n\u003cdiv\u003eTo support a site-per-process policy in Chrome, we needed to complete the tasks outlined below.  These ensure that cross-site navigations and script interactions will not break, despite having all pages from different sites in different processes.  The master tracking bug is \u003ca href\u003d\"https://crbug.com/467770\"\u003ehttps://crbug.com/467770\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eCross-Process Navigations\u003c/b\u003e\u003cbr /\u003e\r\nAny navigation to a different web site requires a process swap in the current tab or frame.\u003cbr /\u003e\r\n\u003ci\u003eStatus: \u003c/i\u003eComplete.  Cross-process navigations are supported in all frames, and they are used for many cases: out-of-process iframes, keeping privileged WebUI or extension pages isolated from web pages, any cross-site main frame navigation, etc.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCross-Process JavaScript\u003c/b\u003e\u003cbr /\u003e\r\nAs mentioned above, some window and frame level interactions are allowed between pages from different sites.  Common examples are postMessage, close, focus, blur, and assignments to window.location, notably excluding any access to page content.  These interactions can generally be made asynchronous and can be implemented by passing messages to the appropriate renderer process.\u003cbr /\u003e\r\n\u003ci\u003eStatus:\u003c/i\u003e Complete.  Chrome supports all required interactions, including frame placeholders, postMessage, close, closed, focus, blur, and assignments to window.location between top-level windows in different processes.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eOut-of-Process iframes\u003c/b\u003e\u003cbr /\u003e\r\nIframes have separate security contexts from their parent document, so cross-site iframes must be rendered in a different process from their parent.  It is also important that an iframe that is from the same origin as a popup window shares a process with the popup window and not its own parent page.  We render these out-of-process iframes in a separate RenderFrame composited into the correct visual location, much like plugins.  This is by far the largest requirement for supporting site-per-process, as it involves a major architecture change to the Chrome and Blink codebases.\u003cbr /\u003e\r\n\u003ci\u003eStatus:\u003c/i\u003e Complete.  The first uses of \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes\"\u003eOut-of-Process iframes\u003c/a\u003e (OOPIFs) launched in Chrome 56, isolating extensions from web content.  Widespread use for cross-site iframes launched in Chrome 67 on desktop, and in Chrome 77 for Android.  Tracked at \u003ca href\u003d\"https://crbug.com/99379\"\u003ehttps://crbug.com/99379\u003c/a\u003e.\u003c/li\u003e\u003cli\u003e\u003cb\u003eCross-Origin Read Blocking\u003c/b\u003e\u003cbr /\u003eWhile any given site is allowed to request many types of cross-site resources (such as scripts and images), the browser process should prevent it from receiving cross-site HTML, XML, and JSON data (based on a combination of MIME type and content sniffing).\u003cbr style\u003d\"font-weight:400\" /\u003e\u003ci style\u003d\"font-weight:400\"\u003eStatus:\u003c/i\u003e\u003cspan style\u003d\"font-weight:400\"\u003e Complete.  Our initial \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/blocking-cross-site-documents\" style\u003d\"font-weight:400\"\u003eCross-Site Document Blocking Policy\u003c/a\u003e\u003cspan style\u003d\"font-weight:400\"\u003e design evolved into \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/corb-for-developers\"\u003eCross-Origin Read Blocking (CORB)\u003c/a\u003e, with a \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md\"\u003eCORB Explainer\u003c/a\u003e.  This was implemented for non-compromised renderer processes when Site Isolation is enabled as of Chrome 63, and for compromised renderers as of Chrome 77.  The work was tracked at \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/268640\" style\u003d\"font-weight:400\"\u003ehttps://crbug.com/268640\u003c/a\u003e\u003cspan style\u003d\"font-weight:400\"\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eBrowser Process Enforcements\u003c/b\u003e\u003cbr /\u003eSome of Chrome's security checks are performed in the renderer process.  When a process is locked to a given site, the browser process can enforce many of these checks itself, limiting what a compromised renderer process can achieve in an attack.  This includes attempts to access site specific stored data and permissions, as well as other attempts to lie to the browser process.\u003cbr /\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt\"\u003eStatus: \u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eMost enforcements are in place, though more are tracked in \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/786673\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://crbug.com/786673\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  \u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003eImproved Renderer Process Limit Policy\u003c/b\u003e\u003cbr /\u003eWe have investigated ways to limit number of extra processes Chrome creates in Site Isolation modes.  One option is to support modes that only isolate a set of origins or sites (i.e., --isolate-origins) rather than all sites (i.e., --site-per-process).  However, we are currently leaning towards isolating all sites given our current findings.  Note that a page from one site may reuse a process that has already been used for that same site, and we aggressively reuse processes in this way for subframes when possible.  Processes will not be reused for cross-site pages.\u003cbr /\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt\"\u003eStatus:\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e On desktop, we isolate all sites, allowing process reuse only for pages from the same site.  On Android, only a subset of sites end up in dedicated processes.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Performance\" /\u003ePerformance\u003c/h2\u003e\u003cdiv\u003eMonitoring the performance impact of Site Isolation on Chrome has been a critical part of this effort.  Site Isolation can affect performance in several ways, both positive and negative: some frames may render faster by running in parallel with the rest of the page, but creating additional renderer processes also increases memory requirements and may introduce latency on cross-process navigations.  We are taking several steps to minimize the costs incurred, and we are using metrics collected from actual browsing data to measure the impact.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eAs mentioned above under \"Renderer Process Limit Policy,\" we investigated one option for reducing the number of processes by isolating only a subset of web sites.  In such a mode, most web sites would continue to use Chrome's old process model, while web sites that users are likely to log into would be isolated.  However, we are currently aiming to isolate all sites if possible, based on current performance measurements, simplicity, and the extra protection it offers.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eOur evaluation is described in our USENIX Security 2019 paper: \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003ca href\u003d\"https://www.usenix.org/conference/usenixsecurity19/presentation/reis\" rel\u003d\"nofollow\"\u003eSite Isolation: Process Separation for Web Sites within the Browser\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-to-Enable\" /\u003eHow to Enable\u003c/h2\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003eSee this \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation\"\u003eSite Isolation Overview page\u003c/a\u003e for more details on how to enable or configure Site Isolation.  In most cases, no action is necessary.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Development-Resources\" /\u003e\u003cb\u003eDevelopment Resources\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003eUpdating Chrome Features:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1Iqe_CzFVA6hyxe7h2bUKusxsjB6frXfdAYLerM3JjPo/edit?usp\u003dsharing\"\u003eFeature Update FAQ for Out-of-Process iframes\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1dCR2aEoBJj_Yqcs6GuM7lUPr0gag77L5OSgDa8bebsI/edit?usp\u003dsharing\"\u003eFeatures to Update for Out-of-Process iframes\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eBuild Status:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eSite Isolation FYI bots: \u003ca href\u003d\"http://build.chromium.org/p/chromium.fyi/builders/Site%20Isolation%20Linux\"\u003eLinux\u003c/a\u003e and \u003ca href\u003d\"http://build.chromium.org/p/chromium.fyi/builders/Site%20Isolation%20Win\"\u003eWindows\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eSite Isolation try bot: \u003ca href\u003d\"http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_site_isolation\"\u003elinux_site_isolation\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-2015-Site-Isolation-Summit-Talks\" /\u003e2015 Site Isolation Summit Talks\u003c/h2\u003e\u003cdiv\u003eTalks and discussion from January 2015.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Site-Isolation-Overview\" /\u003eSite Isolation Overview\u003c/h3\u003e\u003cp\u003e\u003ca href\u003d\"https://docs.google.com/presentation/d/10HTTK4dsxO5p6FcpEOq8EkuV4yiBx2n6dBki8cqDWyo/edit?usp\u003dsharing\" style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003eSlides\u003c/a\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:480px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eSite Isolation Overview\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/3fdbC3DE0YQ?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Chromium-Changes-for-OOPIF-\" /\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eChromium Changes for OOPIF \u003c/span\u003e\u003c/h3\u003e\u003cp\u003e\u003ca href\u003d\"https://docs.google.com/presentation/d/1e25K7BW3etNDm1-lkMltMcCcRDeVwLibBcbACRhqZ1k/edit?usp\u003dsharing\" style\u003d\"font-size:10pt;font-weight:normal;color:rgb(85,26,139);background-color:transparent\"\u003eSlides\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:480px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eChromium Changes for OOPIF\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/gkrKtVkJNPM?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Blink-Changes-for-OOPIF-\" /\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eBlink Changes for OOPIF \u003c/span\u003e\u003c/h3\u003e\u003cp\u003e\u003ca href\u003d\"https://docs.google.com/presentation/d/11nrXiuXBTC72E5l_MUtu2eJN6rcW9PtBewDOPPTk9Bc/edit?usp\u003dsharing\" style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003eSlides\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:480px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eBlink Changes for OOPIF\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/fQf8SPMA-Xk?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Discussions-Questions\" /\u003eDiscussions/Questions\u003c/h2\u003e\r\n\u003cdiv\u003eThe mailing list for technical discussions on Site Isolation is \u003ca href\u003d\"mailto:site-isolation-dev@chromium.org\" style\u003d\"color:rgb(17,85,204);font-family:arial,sans-serif;line-height:21px\" target\u003d\"_blank\"\u003esite-isolation-dev@chromium.org\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4179418459408669564"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4179418459408669564"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4179418459408669564"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"site-isolation"},"sites$revision":{"$t":"63"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6914970529498578082"},"published":{"$t":"2016-05-10T02:10:59.736Z"},"updated":{"$t":"2019-10-14T22:32:38.444Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-14T22:32:35.149Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"DOM Team"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003eThe DOM team is (as of spring 2019) now part of the \u003ca href\u003d\"https://www.chromium.org/teams/rendering\"\u003erendering\u003c/a\u003e super-team. More information will be added here soon.\u003c/p\u003e\u003cp\u003e\u003cb style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003eContact:\u003c/b\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003edom-dev@chromium.org\u003c/li\u003e\u003cli\u003emasonfreed@chromium.org\u003c/li\u003e\u003cli\u003eyuzhehan@chromium.org\u003c/li\u003e\u003cli\u003ejarhar@chromium.org\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cul /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/dom-team"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6914970529498578082"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6914970529498578082"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6914970529498578082"}],"author":[{"name":{"$t":"Dominic Cooney"},"email":{"$t":"dominicc@chromium.org"}}],"sites$pageName":{"$t":"dom-team"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"Wyl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2174197283570369793"},"published":{"$t":"2014-11-03T04:14:54.187Z"},"updated":{"$t":"2019-10-10T21:11:59.620Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-10T21:11:57.345Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Working with Nested Third Party Repositories"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eThe Chromium source tree includes other repositories in third party directories (\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003esrc/third_party\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e) and elsewhere. \u003c/font\u003e\u003c/p\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Make-changes\" /\u003e\u003cfont size\u003d\"3\"\u003eMake changes\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;background-image:none\"\u003e\u003ca name\u003d\"TOC-Do-your-work-on-a-branch-here-and-commit-locally.\" /\u003e\u003cspan style\u003d\"line-height:1.25em;font-weight:normal;background-color:transparent;font-size:12px\"\u003e\u003cfont face\u003d\"Monaco, DejaVu Sans Mono, Bitstream Vera Sans Mono, Lucida Console, monospace\"\u003eD\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;line-height:1.25em;font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003eo your work, on a branch here, and commit locally.\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e  git checkout -b work\u003cbr /\u003e  vim third-party-file.cc\u003cbr /\u003e  git commit -a -m \"work done\"\u003cbr /\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Upload-for-review\" /\u003e\u003cfont size\u003d\"3\"\u003eUpload for review\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:13.3333330154419px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)\" /\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e git cl upload\u003cbr /\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\" /\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Do-the-usual-add-reviewers-seek-lgtm-dance.-Once-reviewed-submit-your-change:-\" /\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;line-height:1.25em;background-color:transparent\"\u003eDo the usual add-reviewers-seek-lgtm dance. \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;line-height:1.25em;background-color:transparent\"\u003eOnce reviewed, submit your change: \u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e \u003cspan style\u003d\"line-height:15px;background-color:transparent\"\u003egit cl land\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Done-Not-quite:-you-need-to-roll-your-change-into-the-Chromium-tree.\" /\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;line-height:1.25em;background-color:transparent\"\u003eDone?  Not quite: you need to roll your change into the Chromium tree.\u003c/span\u003e\u003c/h2\u003e\u003ch2 style\u003d\"border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Roll-DEPS\" /\u003e\u003cfont size\u003d\"3\"\u003eRoll DEPS\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif\"\u003eSince Chromium mirrors these projects with git, the DEPS file entry for the project has a git hash. So how do you update the DEPS file hash for source code changes that don't really live in git?\u003c/p\u003e\u003cdiv style\u003d\"font-size:13.6000003814697px\"\u003eMethod #1: Use the depot_tools roll-dep script\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.6000003814697px\"\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e # cd to the main src directory for your checkout\r\n cd src\r\n # Create and switch to a new branch\r\n git new-branch depsroll\r\n # Run roll-dep giving the path and the desired revision\r\n # if you omit the revision, it will roll to the current repo HEAD\r\n roll-dep src/third_party/foo [--roll-to\u003dSVN_REVISION_NUMBER/GIT_COMMIT_HASH]\u003c/pre\u003e\u003c/div\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif\"\u003eMethod #2: Manual inspection (patch the hash into the DEPS file by hand).\u003c/p\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cpre style\u003d\"padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em\"\u003e# cd to the main src directory for your checkout\r\npushd src\r\n# Create and switch to a new branch\r\ngit new-branch depsroll\r\n# cd to the directory listed in the DEPS file (e.g., src/third_party/cld_2/src for 'cld2')\r\npushd third_party/foo/bar\r\n# Fetch (but do not pull) the latest revisions from Chromium's git mirror of the remote repository\r\ngit fetch origin\r\n# Use 'git log' to list the commits in the mirror and find the hash of the one you need\r\ngit log origin\r\n# Go back to src/\r\npopd\r\n# Patch the revision hash into the DEPS file by hand.\u003c/pre\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003eRegardless of method used, the result is a modified DEPS file. Commit it locally and upload for review:\u003c/div\u003e\u003cdiv\u003e\u003cpre style\u003d\"font-size:12px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e  git commit -a -m \"roll third_party/whatever deps because ...\"\u003cbr /\u003e git cl upload\u003cbr /\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background-image:none\"\u003e\u003ca name\u003d\"TOC-Adding-new-repositories-to-DEPS\" /\u003eAdding new repositories to DEPS\u003c/h2\u003e\u003cp style\u003d\"max-width:64em\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:10pt;line-height:1.25em\"\u003eEnsure the repository in question \u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"font-family:arial,sans-serif;font-size:10pt;line-height:1.25em\"\u003eis mirrored at chromium.googlesource.com\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:10pt;line-height:1.25em\"\u003e. We do this to avoid \u003c/span\u003e\u003cspan style\u003d\"line-height:16.6666660308838px\"\u003eswamping\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:1.25em\"\u003e upstream hosts with loads of traffic from our developers and bot fleet. To mirror a repository, please file an \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry?template\u003dBuild%20Infrastructure\" rel\u003d\"nofollow\" style\u003d\"font-family:arial,sans-serif;line-height:1.25em;font-size:10pt;color:rgb(0,0,204);background-color:transparent\"\u003einfrastructure ticket\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;line-height:1.25em;font-size:10pt;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7768323185310599139"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/get-the-code/working-with-nested-repos"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2174197283570369793"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2174197283570369793"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2174197283570369793"}],"author":[{"name":{"$t":"Sasha Bermeister"},"email":{"$t":"sashab@chromium.org"}}],"sites$pageName":{"$t":"working-with-nested-repos"},"sites$revision":{"$t":"42"}},{"gd$etag":"\"Wil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5203336190257906427"},"published":{"$t":"2010-06-18T18:19:12.151Z"},"updated":{"$t":"2019-10-10T18:16:31.932Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-09T00:11:05.355Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Accessibility: Assistive technology support"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eTo discuss the use of Chrome with assistive technology, please join the \u003ca href\u003d\"http://groups.google.com/a/chromium.org/group/chromium-accessibility\" target\u003d\"_blank\"\u003echromium-accessibility\u003c/a\u003e group.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eA \u003ci\u003escreen reader\u003c/i\u003e is one type of assistive technology used by visually impaired users, or users with other disabilities, who need the screen described to them, often using synthesized text-to-speech or via a refreshable braille display.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA \u003ci\u003emagnifier\u003c/i\u003e is another type of assistive technology, for users with low-vision. It may magnify the entire screen or only a portion of the screen. It might additionally provide extra visual cues to help the user find the cursor and the current focused control.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChrome is compatible with many screen readers and magnifiers.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn addition, Accessibility APIs can be used for automation or testing.\u003cbr /\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Supported-Assistive-Technology\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cstrong\u003eSupported Assistive Technology\u003c/strong\u003e\u003c/span\u003e\u003c/h4\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial,sans-serif\" size\u003d\"2\"\u003eWe test Chrome with recent versions of the following assistive technology:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-JAWS-Windows-NVDA-Windows-Dolphin-Supernova-Windows-ZoomText-Windows-VoiceOver-Mac-OS-X-This-assistive-technology-may-work:\" /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"http://www.freedomscientific.com/products/fs/jaws-product-page.asp\" style\u003d\"color:rgb(0,102,204)\" rel\u003d\"nofollow\"\u003eJAWS\u003c/a\u003e\u003cfont color\u003d\"#999999\"\u003e \u003c/font\u003e(Windows)\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"http://www.nvda-project.org/\" style\u003d\"color:rgb(0,102,204)\" rel\u003d\"nofollow\"\u003eNVDA\u003c/a\u003e\u003cfont color\u003d\"#999999\"\u003e \u003c/font\u003e(Windows)\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"https://yourdolphin.com/supernova-magnifier-screen-reader\" rel\u003d\"nofollow\"\u003eDolphin Supernova\u003c/a\u003e (Windows)\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-weight:normal\"\u003e\u003ca href\u003d\"http://www.aisquared.com/zoomtext\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eZoomText\u003c/a\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-weight:normal\"\u003e(Windows)\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"http://www.apple.com/accessibility/voiceover/\" style\u003d\"color:rgb(0,102,204)\" rel\u003d\"nofollow\"\u003e\u003cfont face\u003d\"arial,sans-serif\"\u003eVoiceOver\u003c/font\u003e\u003c/a\u003e\u003cfont color\u003d\"#999999\" face\u003d\"arial,sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial,sans-serif\"\u003e(Mac OS X)\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial,sans-serif\" size\u003d\"2\"\u003eThis assistive technology may work:\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:arial,sans-serif\"\u003e\u003ca href\u003d\"https://live.gnome.org/Orca\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eOrca\u003c/a\u003e \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e(Linux)\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Getting-the-latest-version-of-Chrome\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cstrong\u003eGetting the latest version of Chrome\u003c/strong\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-If-you-are-reporting-bugs-please-test-the-Canary-version-of-Chrome-which-can-be-installed-alongside-the-standard-version-you-already-have-installed.-It-helps-a-lot-to-know-if-the-bug-reproduces-in-the-latest-version-or-not.\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eIf you are reporting bugs, please test the \"Canary\" version of Chrome, which can be installed alongside the standard version you already have installed. It helps a lot to know if the bug reproduces in the latest version or not.\u003c/span\u003e\u003c/font\u003e\u003c/h4\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-weight:normal;font-size:small\"\u003e\u003ca href\u003d\"https://www.google.com/url?sa\u003dt\u0026amp;rct\u003dj\u0026amp;q\u003d\u0026amp;esrc\u003ds\u0026amp;source\u003dweb\u0026amp;cd\u003d1\u0026amp;cad\u003drja\u0026amp;ved\u003d0CDcQFjAA\u0026amp;url\u003dhttps%3A%2F%2Fwww.google.com%2Fintl%2Fen%2Fchrome%2Fbrowser%2Fcanary.html\u0026amp;ei\u003d3x52UcGWPMGpiAKZhoBg\u0026amp;usg\u003dAFQjCNEmCd7QnngnWgQiA5M_Vyvwzq71Vw\u0026amp;sig2\u003dlTuBDKvb6i4xs7Ph8fZjGQ\u0026amp;bvm\u003dbv.45580626,d.cGE\" target\u003d\"_blank\"\u003eChrome Canary download instructions\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003ePlease report bugs at \u003ca href\u003d\"http://CRBug.com\"\u003eCRBug.com\u003c/a\u003e (redirects to \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/\"\u003ehttps://bugs.chromium.org/p/chromium/\u003c/a\u003e) \u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-weight:normal;font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you will be trying Chrome with a Windows screen reader, you may want to read the page on \u003c/span\u003e\u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/keyboard-access\" style\u003d\"color:rgb(85,26,139);outline-style:none;outline-width:initial;outline-color:initial\"\u003eKeyboard Access\u003c/a\u003e first. \u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Other-pages-on-accessibility\" /\u003eOther pages on accessibility\u003c/h4\u003e\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/keyboard-access\"\u003eAccessibility: Keyboard Access\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/touch-access\" style\u003d\"color:rgb(85,26,139)\"\u003eAccessibility: Touch Access\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/low-vision-support\" style\u003d\"font-size:10pt;color:rgb(0,102,204);background-color:transparent\"\u003eAccessibility: Low-Vision Support\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility\" target\u003d\"_blank\"\u003eAccessibility Design Document\u003c/a\u003e (for developers)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/assistive-technology-support"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5203336190257906427"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5203336190257906427"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5203336190257906427"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"assistive-technology-support"},"sites$revision":{"$t":"23"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9056417159816074094"},"published":{"$t":"2019-10-08T23:36:55.691Z"},"updated":{"$t":"2019-10-08T23:36:55.691Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-08T23:36:55.691Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9056417159816074094"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9056417159816074094"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9056417159816074094"}],"author":[{"name":{"$t":"Alex Chromium Pau"},"email":{"$t":"alexpau@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2019-10-07"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.samsung.com/us/computing/chromebooks/15-18/chromebook-4-15-6-32gb-storage-4gb-ram-xe350xba-k01us/\"\u003eSamsung Chromebook+\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Casta"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"M75"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2807135038098562787"},"published":{"$t":"2019-10-08T23:35:46.923Z"},"updated":{"$t":"2019-10-08T23:35:46.923Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-08T23:35:46.923Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2807135038098562787"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2807135038098562787"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2807135038098562787"}],"author":[{"name":{"$t":"Alex Chromium Pau"},"email":{"$t":"alexpau@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2019-10-07"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.samsung.com/us/computing/chromebooks/under-12/chromebook-4-11-6-32gb-storage-4gb-ram-xe310xba-k01us/\"\u003eSamsung Chromebook 4\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Bluebird"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":"R76"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"UCl7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6107327048239600428"},"published":{"$t":"2011-07-19T06:17:49.101Z"},"updated":{"$t":"2019-10-04T19:26:38.673Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-10-04T19:26:38.668Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Web Development Style Guide"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:14.6667px;white-space:pre-wrap\"\u003ehas moved to here: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/web/web.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/styleguide/web/web.md\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/web-development-style-guide"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6107327048239600428"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6107327048239600428"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6107327048239600428"}],"author":[{"name":{"$t":"James Hawkins"},"email":{"$t":"jhawkins@chromium.org"}}],"sites$pageName":{"$t":"web-development-style-guide"},"sites$revision":{"$t":"59"}},{"gd$etag":"\"XSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/581184038725002641"},"published":{"$t":"2011-06-21T17:33:40.678Z"},"updated":{"$t":"2019-09-30T04:07:53.984Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-30T04:07:51.725Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Content module"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"4\"\u003eThis documentation moved to the repository at \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/content/README.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/content/README.md\u003c/a\u003e (except for the diagram below).\u003c/font\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://docs.google.com/a/chromium.org/drawings/d/13yo_bSgwVdOUJFCIeVLL_rmtQ2SqElmxouC81q46GAk/edit?hl\u003den_US\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1308680052371/developers/content-module/Content.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe diagram above illustrates the layering of the different modules. A module can include code directly from lower modules. However, a module can not include code from a module that is higher than it.  This is enforced through DEPS rules. Modules can implement embedder APIs so that modules lower than them can call them. Examples of these APIs are the WebKit API and the Content API.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/content-module"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/581184038725002641"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/581184038725002641"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/581184038725002641"}],"author":[{"name":{"$t":"John Abd-El-Malek"},"email":{"$t":"jam@chromium.org"}}],"sites$pageName":{"$t":"content-module"},"sites$revision":{"$t":"24"}},{"gd$etag":"\"XCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2547469806500607582"},"published":{"$t":"2008-08-29T05:24:23.129Z"},"updated":{"$t":"2019-09-24T16:51:29.092Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-24T16:51:26.235Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Getting Involved"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv\u003eHere are some ways you can get involved with Chromium:\u003c/div\u003e\r\n\u003cul style\u003d\"margin-left:10px\"\u003e\r\n\u003cli\u003eJoin some of our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/discussion-groups\" style\u003d\"outline-style:none;color:rgb(85,26,139)\"\u003edeveloper discussion groups\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eVisit the \u003ca href\u003d\"https://productforums.google.com/forum/#!forum/chrome\"\u003eHelp Center\u003c/a\u003e and answer users' questions\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eHelp with \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003eTesting\u003c/a\u003e\u003c/li\u003e\r\n\u003cul style\u003d\"margin-left:10px\"\u003e\u003cli\u003eProvide \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:47b7501e05b5377c\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" class\u003d\"disabled\"\u003ereduced test cases\u003c/a\u003e to help improve web compatibility\u003c/li\u003e\r\n\u003cli\u003eGet on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/dev-channel\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eBeta or Dev channel\u003c/a\u003e or grab the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/download-chromium\"\u003elatest trunk build of Chromium\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003eFile bugs\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/bug-triage\"\u003eTriage bugs\u003c/a\u003e to make existing bug reports more useful\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry?template\u003dTranslation%20Issue\"\u003eReport translation\u003c/a\u003e issues\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eDevelop Chromium\u003c/li\u003e\r\n\u003cul style\u003d\"margin-left:10px\"\u003e\u003cli\u003eSee the pages for \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003eDevelopers\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eRead the \u003ca href\u003d\"https://docs.google.com/a/google.com/present/view?id\u003d0AetfwCoL2lQAZGQ5bXJ0NDVfMGRtdGQ0OWM2\"\u003eLife of a Chromium Developer\u003c/a\u003e introduction and the \u003ca href\u003d\"http://dev.chromium.org/developers/contributing-code\"\u003eContributing\u003c/a\u003e page\u003c/li\u003e\r\n\u003cli\u003eAdopt a bug that's marked \u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?q\u003dHotlist:GoodFirstBug\u0026amp;can\u003d2\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003eGoodFirstBug\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eSubmit \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/contributing-code\"\u003epatches\u003c/a\u003e (submit enough and you can \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/become-a-committer\"\u003ebecome a committer\u003c/a\u003e!)\u003c/li\u003e\u003cli\u003eOptionally apply for a Chromium account by emailing \u003ca href\u003d\"mailto:accounts@chromium.org\"\u003eaccounts@chromium.org\u003c/a\u003e (Note: you must already be approved as a committer) (if you're a Googler, click \u003ca href\u003d\"https://docs.google.com/forms/d/e/1FAIpQLSfihgUcSmNz3g1iGIyHX-n9NWUi2oCuMh8JtKJGR2gPZiQnKw/viewform\"\u003ehere\u003c/a\u003e instead)\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/getting-involved"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2547469806500607582"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2547469806500607582"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2547469806500607582"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"getting-involved"},"sites$revision":{"$t":"35"}},{"gd$etag":"\"Xil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6547582426036225595"},"published":{"$t":"2011-09-27T02:17:40.837Z"},"updated":{"$t":"2019-09-24T08:32:45.850Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-24T08:32:43.315Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Content API"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-This-has-moved-to-the-Chromium-repository-at-https:-chromium.googlesource.com-chromium-src-HEAD-content-public-README.md\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont size\u003d\"3\" style\u003d\"font-weight:normal\"\u003eThis has moved to the Chromium repository at\u003c/font\u003e\u003cfont\u003e \u003c/font\u003e\u003c/font\u003e\u003cfont size\u003d\"3\" style\u003d\"background-color:transparent;font-weight:normal\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/content/public/README.md\" style\u003d\"background-color:transparent;font-weight:normal\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/content/public/README.md\u003c/a\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/581184038725002641"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/content-module/content-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6547582426036225595"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6547582426036225595"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6547582426036225595"}],"author":[{"name":{"$t":"John Abd-El-Malek"},"email":{"$t":"jam@chromium.org"}}],"sites$pageName":{"$t":"content-api"},"sites$revision":{"$t":"37"}},{"gd$etag":"\"XSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5871680510945969974"},"published":{"$t":"2013-12-26T09:57:13.034Z"},"updated":{"$t":"2019-09-19T13:07:29.026Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-19T13:07:26.543Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Instrumented libraries for dynamic tools"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eInstrumented libraries are a part of Chromium's development infrastructure. They are intended to complement sanitizer tools (\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/addresssanitizer\"\u003eAddressSanitizer\u003c/a\u003e, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/memorysanitizer\"\u003eMemorySanitizer\u003c/a\u003e, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/threadsanitizer-tsan-v2\"\u003eThreadSanitizer\u003c/a\u003e).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnly Ubuntu Trusty x86_64 is supported at this time.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eSanitizer tools rely on compile-time instrumentation. However, Chromium code may call into system-installed third-party shared libraries, which were not built with the appropriate instrumentation. This is a problem:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ebugs in third-party libraries, which may affect Chromium, go undetected,\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ecertain Chromium bugs may go undetected (e.g. passing an invalid buffer to third-party code),\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eMemorySanitizer generates lots of bogus reports, which makes it unusable. This happens because MSan doesn't recognize any memory initialization which happens in uninstrumented code.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eTo avoid this issue, we've made it possible to make Chromium use sanitizer-instrumented versions of third-party DSOs. By setting a GYP flag, you can either have them built from source during Chromium build, or download pre-built binaries from Google Storage. The list contains ~50 third-party packages, which should cover most of the DSO dependencies of Chrome and tests (enough at least to run MSan without bogus reports).\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-pre-built-binaries\" /\u003eUsing pre-built binaries\u003c/h2\u003e\u003cdiv\u003eFollow the MemorySanitizer \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/memorysanitizer\"\u003einstructions\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that we don't provide pre-built binaries for every configuration. At this point in time only MSan is supported, with \u003ccode\u003emsan_track_origins\u003c/code\u003e either 0 or 2.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Building-from-source\" /\u003eBuilding from source\u003c/h2\u003e\u003cdiv\u003eFirst you need to install build dependencies:\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo third_party/instrumented_libraries/scripts/install-build-deps.sh\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAdditionally, if you have \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003egccgo\u003c/span\u003e installed, you probably want to remove it with:\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo apt-get remove --purge gccgo-4.9\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eWith this package installed, running \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003eclang++\u003c/span\u003e gives the error \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003ecannot find -lstdc++\u003c/span\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo build instrumented libraries from source, add \u003ccode\u003euse_locally_built_instrumented_libraries\u003dtrue\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eto \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eargs.gn\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. This will add ~50 extra steps to the build. Each step runs a script which does the following:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003echecks out a specific package with \u003ccode\u003eapt-get source\u003c/code\u003e,\u003c/span\u003e\u003c/li\u003e\u003cli\u003emaybe applies a Chromium-specific patch,\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ebuilds the package using \u003ccode\u003e./configure\u003c/code\u003e + \u003ccode\u003emake\u003c/code\u003e,\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003einstalls the shared libraries into \u003ccode\u003e$OUTPUT_DIR/instrumented_libraries/\u0026lt;sanitizer_name\u0026gt;/lib/\u003c/code\u003e,\u003c/span\u003e\u003c/li\u003e\u003cli\u003ecopies the source archives to \u003ccode\u003e$OUTPUT_DIR/instrumented_libraries/sources/\u003c/code\u003e.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eGOMA is supported (just add \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003euse_goma\u003d1\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e).\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Adding-new-packages\" /\u003eAdding new packages\u003c/h2\u003e\u003cdiv\u003eYou'll need to ping earthdok@ or glider@ to do this. The information below is for reference. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo add a new package, you need to do the following:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eget OSS compliance approval,\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eadd a new target to \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ccode\u003ethird_party/instrumented_libraries/BUILD.gn\u003c/code\u003e,\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eadd the package to \u003ccode\u003ethird_party/instrumented_libraries/scripts/install-build-deps.sh\u003c/code\u003e,\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003emake sure it builds and works on Trusty (i.e. where applicable),\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eupdate the pre-built binaries.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eUsually you want to use the same configure flags that \u003ccode\u003edebian/rules\u003c/code\u003e uses.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo rebuild the binaries, \u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003erun:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ccode\u003ethird_party/instrumented_libraries/scripts/build_and_package.py all\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThe entire process will take several hours.  For that reason, it is recommended to use \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e--parallel \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eto build all configs concurrently, and \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003e-j96\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e (or whatever value you prefer) to build multiple packages concurrently.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eIt's a good idea to not do this on Goobuntu. We have a couple GCE instances configured for this.  You can also build in an Ubuntu VM.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eAfter uploading the archives to GCS as the script instructs, you'll get several \u003ccode\u003e.sha1\u003c/code\u003e files. You should commit those under \u003ccode\u003ethird_party/instrumented_libraries/binaries/\u003c/code\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/instrumented-libraries-for-dynamic-tools"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5871680510945969974"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5871680510945969974"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5871680510945969974"}],"author":[{"name":{"$t":"Alexander Potapenko"},"email":{"$t":"glider@chromium.org"}}],"sites$pageName":{"$t":"instrumented-libraries-for-dynamic-tools"},"sites$revision":{"$t":"24"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5576716163298681133"},"published":{"$t":"2019-09-18T10:30:17.087Z"},"updated":{"$t":"2019-09-18T10:31:02.352Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-18T10:31:02.318Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"s4.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5576716163298681133"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5276382689810110447"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/recording-tracing-runs/s4.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5576716163298681133"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5576716163298681133"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5576716163298681133"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5576716163298681133"}],"author":[{"name":{"$t":"Sami Kyostila"},"email":{"$t":"skyostil@google.com"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4364970555981929925"},"published":{"$t":"2019-09-18T10:28:41.875Z"},"updated":{"$t":"2019-09-18T10:28:41.923Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-18T10:28:41.875Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"s3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4364970555981929925"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5276382689810110447"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/recording-tracing-runs/s3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4364970555981929925"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4364970555981929925"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4364970555981929925"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4364970555981929925"}],"author":[{"name":{"$t":"Sami Kyostila"},"email":{"$t":"skyostil@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5784398069579999654"},"published":{"$t":"2019-09-18T10:27:06.400Z"},"updated":{"$t":"2019-09-18T10:27:06.447Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-18T10:27:06.400Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"s2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5784398069579999654"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5276382689810110447"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/recording-tracing-runs/s2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5784398069579999654"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5784398069579999654"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5784398069579999654"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5784398069579999654"}],"author":[{"name":{"$t":"Sami Kyostila"},"email":{"$t":"skyostil@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/266006179793898860"},"published":{"$t":"2019-09-18T10:19:10.031Z"},"updated":{"$t":"2019-09-18T10:24:08.230Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-18T10:24:08.204Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"s.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/266006179793898860"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5276382689810110447"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/recording-tracing-runs/s.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/266006179793898860"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/266006179793898860"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/266006179793898860"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/266006179793898860"}],"author":[{"name":{"$t":"Sami Kyostila"},"email":{"$t":"skyostil@google.com"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/588995753988556500"},"published":{"$t":"2019-06-24T09:21:57.763Z"},"updated":{"$t":"2019-09-17T18:17:07.096Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-17T18:17:04.537Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"U2F ECDSA vulnerability"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003ePublished \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003eJun 24, 2019\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003e\u003cspan style\u003d\"font-size:26pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eU2F ECDSA vulnerability\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis page provides technical background and advice to users who are affected by a security vulnerability in Chrome OS' experimental \"built-in security key\" feature that implements an authenticator in accordance with the Universal 2nd Factor specification.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Just-tell-me-what-to-do-\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003e\"Just tell me what to do!\"\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf you're not interested in technical detail, but just want to fix your account security, just follow these steps:\u003c/span\u003e\u003c/p\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDouble-check whether you're affected: This is about the experimental built-in security key function where your Chromebook acts as a security key that you can trigger by pressing the Chromebook's power button. If you have never used this feature, you can stop reading now.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMake a list of your accounts with websites etc. where you have registered the built-in security key. These are at risk because the built-in security key can potentially be faked by an attacker without the attacker having your Chrome OS device.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUnregister the built-in security key from all these services. Exact instructions vary by service, but typically there are \"account settings\" or \"security settings\" that list registered security keys and give you the option to remove / unregister security keys. There is no need to change passwords or other account security settings.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(optional) Review recent successful logins to services to determine whether there's anything suspicious.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn case you received a \"Internal security key requires reset\" notification, click \"Reset\" on the notification to prevent it from showing again.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThat's it, you're good. You can stop reading at this point unless you are interested in further technical details.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Technical-Details\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eTechnical Details\u003c/span\u003e\u003c/h1\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Vulnerability-description\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eVulnerability description\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe discovered a vulnerability in the H1 security chip firmware concerning ECDSA signature generation. The firmware code used incompatible transfer instructions when passing a critical secret value to the cryptographic hardware block, resulting in generating secret values of a specific structure and having a significant loss of entropy in the secret value (64 bits instead of 256 bits). We confirmed that the incorrect generation of the secret value allows it to be recovered, which in turn allows the the underlying ECC private key to be obtained. Thus, attackers that have a single pair of signature and signed data can effectively compute the private key, breaking any functionality or protocols that use the key pair in question.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Impacted-features\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eImpacted features\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eECDSA signatures generated by H1 were only used by Chrome OS for the experimental built-in U2F authenticator. An attacker who observes a signature produced by the built-in U2F authenticator can thus obtain the private key and spoof the authenticator from that point on. In other words, correct signatures no longer provide a strong signal of possession of the corresponding Chrome OS device.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNote that signatures are generated both when the U2F authenticator gets registered with a service, and when processing an authentication challenge (e.g. when logging in to a 2FA-enabled service using the built-in U2F authenticator).\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe don't expect the vulnerable signatures to have been exposed broadly as they will usually be passed across HTTPS connections. However, since the signature is not considered sensitive in the U2F protocols, it would be inadequate to assume that no signatures have been observed or logged / stored in locations where they still may be retrieved from. As such, the built-in U2F authenticator feature that has generated vulnerable signatures using the vulnerable H1 firmware must be considered cryptographically broken.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn practice, even the cryptographically broken U2F implementation as described above still doesn't immediately cause account compromise. For one, the primary factor in two-factor-authentication scheme remains unaffected. Secondly, even the broken U2F implementation provides phishing protection against most attackers since they won't easily be able to obtain a signature to break. Specifically, obtaining signatures is complicated by the U2F protocol creating individual keys for each service that a security key is enrolled with.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNevertheless, we recommend users to take remediation steps as described below to avoid the risk of running with a cryptographically weakened U2F authenticator.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Remediation\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eRemediation\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFull remediation requires both a firmware fix and retiring key pairs that have generated vulnerable signatures.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Firmware-fix\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eFirmware fix\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFixed firmware for the H1 security chip has been shipping with Chrome OS version 75 and later and the update has automatically been installed on devices. No user action is required to get the firmware fix. Concerned users can double-check the H1 firmware version as described \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability#TOC-Affected-versions\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebelow\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to verify they've been updated to fixed firmware. The fixed firmware no longer generates vulnerable signatures. Note that this doesn't retroactively \"fix\" affected key pairs that have previously generated vulnerable signatures, these can still be broken if a vulnerable signature is available to an attacker.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Retiring-affected-ECDSA-keys\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eRetiring affected ECDSA keys\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEach registration of the built-in U2F authenticator with a service has a corresponding ECDSA key. All keys that have produced vulnerable signatures are no longer secure, so should no longer be trusted by services. Unfortunately there is no way to centrally revoke security keys, so users need to manually unregister the built-in U2F authenticator from services. See the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability#TOC-Just-tell-me-what-to-do-\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eadvice above\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for more details.\u003c/span\u003e\u003c/p\u003e\u003ch2 style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Affected-versions\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected versions\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProduction H1 firmware versions with a version number of 0.3.14 and earlier contain the vulnerability. Versions 0.3.15 and later are not vulnerable. The H1 firmware version is listed on the \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://system\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e page under \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecr50_version\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, specifically the \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRW\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e line.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFixed H1 firmware versions are shipping with Chrome OS version 75 and later and get automatically installed by the OS. Note that the firmware will never get downgraded, so even if you downgrade to an earlier OS version, the fixed firmware will keep running on the device.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Affected-devices\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected devices\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAll shipping devices that have an H1 security chip are potentially affected. A full list of models with public codename (listed in \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePlatform\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCustomization ID\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e on the \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://version\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e page) and model name is given below. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eakali360 - Acer Chromebook Spin 13 (CP713-1WN)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eakali - Acer Chromebook 13  (CB713-1W)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ealan - HP Chromebook 11 G6 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ealeena - Acer Chromebook 315\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eampton - ASUS Chromebook Flip C214\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eapel - ASUS Chromebook C204\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eastronaut - Acer Chromebook 11 (C732)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebabymako - ASUS chromebook C403\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebabymega - ASUS Chromebook C223\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebabytiger - ASUS Chromebook C523\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebarla - HP Chromebook 11A G6 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebasking - ASUS Chromebook C213NA/C213SA\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebigdaddy - HP Chromebook 14 / HP Chromebook 14 G5\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eblacktip360 - CTL chromebook NL7T-360\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eblacktip - CTL chromebook NL7\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eblacktiplte - CTL Chromebook NL7 LTE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eblue - Acer Chromebook 15 CB315-1H / 1HT\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebobba360 - Acer Chromebook Spin 511\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebobba - Acer Chromebook 311\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebob - ASUS Chromebook Flip C101PA\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebruce - Acer Chromebook Spin 15 CP315-1H / 1HT\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecareena - HP Chromebook 14 db0000-db0999\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edru - Acer Chromebook Tab 10 (D651N / D650N)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edruwl - CTL Chromebook Tab Tx1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edumo - ASUS Chromebook Tablet CT100\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eelectro - Acer Chromebook Spin 11 (R751T / CP511)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eepaulette - Acer Chromebook 514\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eeve - Google Pixelbook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efleex - Dell Chromebook 3100\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egrabbiter - Dell Chromebook 3100 2in1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ekasumi360 - Chromebook Spin 311 (R721T)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ekasumi - Chromebook 311 (C721)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ekench - HP Chromebox G2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003elava - Acer Chromebook Spin 11 (CP311-1H \u0026amp; CP311-1HN)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eliara - Lenovo 14e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emeep - HP Chromebook x360 11 G2 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emimrock - HP Chromebook 11 G7 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enasher360 - Dell Chromebook 11 2-in-1 5190\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enasher - Dell Chromebook 11 5190\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enautiluslte - Samsung Chromebook Plus (LTE)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enautilus - Samsung Chromebook Plus (V2)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enocturne - Pixel Slate\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eorbatrix - Dell Chromebook 3400\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epantheon - Yoga C630 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ephaser360 - Lenovo 300e/500e Chromebook 2nd Gen\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ephaser - Lenovo 100e Chromebook 2nd Gen\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epyro - Lenovo Thinkpad 11e Chromebook (4th Gen)/Lenovo Thinkpad Yoga 11e Chromebook (4th Gen)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erabbid - ASUS Chromebook C423\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erobo360 - Lenovo 500e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erobo - Lenovo 100e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esand - Chromebook 15 (CB515 - 1HT / 1H)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esanta - Acer Chromebook 11 (CB311 - 8H / 8HT)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eshyvana - ASUS Chromebook Flip C434\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esion - Acer Chromebox CXI3\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esnappy - HP Chromebook x360 11 G1 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esona - HP Chromebook x360 14\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esoraka - HP Chromebook x2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esparky360 - Acer Chromebook Spin 512(R851TN)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esparky - Acer Chromebook 512(C851/C851T)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esyndra - HP Chromebook 15 G1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eteemo - ASUS Chromebox 3\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003evayne - Dell Inspiron Chromebook 14 2-in-1 7486\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewhitetip - CTL Chromebook J41 / J41T\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewhitetip - PCmerge Chromebook AL116\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewhitetip - Prowise Chromebook Eduline\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewhitetip - Sector 5 E3 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewhitetip - Viglen Chromebook 11C\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewukong - CTL Chromebox CBx1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewukong - Promethean Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewukong - ViewSonic NMP660 Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Q-A\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eQ\u0026amp;A\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis section provides answers for situations we expect users to find themselves in.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-I-have-been-getting-a-notification-saying-Internal-security-key-requires-reset-.-Is-this-related-\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eI have been getting a notification saying \"Internal security key requires reset\". Is this related?\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:624px;height:407px\"\u003e\u003cimg height\u003d\"407\" src\u003d\"https://lh5.googleusercontent.com/RgOXv39FQJIDYi_NyQ1d9O5h2VKRrely3La_jLnwuMi04RiTox9jTiqQSwzBm_PY8nGhG5ED8aJ6X1eQX0s56_9doQ6EIoqXl5BUiab1Dm8SuFxPJqTeOY_YPybM2fnYQ-sI4LOT\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"624\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYes. Chrome OS M76 shows a system notification on all devices that have the legacy built-in U2F authenticator feature enabled manually via \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Note that the notification triggers on whether the feature is enabled, regardless of whether you have actually used the U2F authenticator with any services. If you have registered the built-in U2F authenticator with any services, please unregister as explained above. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere's no good reason to continue using the legacy feature that was enabled via \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags u2f\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags g2f\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, but users should switch to the improved implementation, which the \"Reset\" button on the notification will do for you without having to go through \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-I-can-t-live-without-the-built-in-U2F-authenticator.-What-to-do-\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eI can't live without the built-in U2F authenticator. What to do?\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe good news is that we have been working on an improved implementation of the built-in U2F authenticator feature for a while. This will not only be unaffected by the bug since it never generated signatures that have the vulnerability, but it also has other security improvements. In particular the improved implementation now respects user boundaries, i.e. each Chrome OS user has their own virtual instance of an U2F authenticator. Also, the underlying encryption keys get discarded when you go through powerwash, recovery, or switch to developer mode.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe new implementation is still not officially launched, but can be tried out at this point. To enable, open \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and type \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags u2f,user_keys\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Note that existing registrations with services (which you should have removed per the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability#TOC-Just-tell-me-what-to-do-\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eadvice above\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e on this page) will no longer work, so you need to re-register the built-in U2F authenticator with any services.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-I-have-lost-access-to-a-service-that-had-the-built-in-U2F-authenticator-configured-as-the-only-valid-security-key.-Help-\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eI have lost access to a service that had the built-in U2F authenticator configured as the only valid security key. Help!\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYou can temporarily re-enable the legacy implementation of the built-in U2F authenticator by issuing the \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags u2f\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (see also the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability#TOC-How-do-the-various-u2f_flags-commands-in-crosh-affect-behavior-\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003equestion on u2f_flags behavior\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e). Your old registrations should now work again. After you regain access to the affected service, please turn the legacy U2F authenticator off again.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-How-do-the-various-u2f_flags-commands-in-crosh-affect-behavior-\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eHow do the various u2f_flags commands in \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003e affect behavior?\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e command in \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e allows you to control the behavior of the built-in U2F authenticator as follows:\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags u2f,user_keys\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003euser_keys\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e flag enables the improved built-in U2F authenticator implementation. Users who want to test-drive the feature and are aware of the risk of using beta quality features can use this.\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen invoked without a parameter, the command will turn of the built-in U2F authenticator feature.\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags u2f\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eu2f_flags g2f\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEnables legacy built-in U2F authenticator behavior. There is no reason to continue using this; enabling will trigger the \"Internal security key requires reset\" system notification. There is no good reason to continue using the legacy implementation at this point.\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:624px;height:523px\"\u003e\u003cimg height\u003d\"523\" src\u003d\"https://lh5.googleusercontent.com/-FCWZDxNb0xWgVpTfpn1uNZyp0LPi_IFzIlW86Qp8RyuvEZE5Pc0DO-7HIt6yuc0MK3sEIyvGHiKldUccf94phWPPHcoa96cUegu1yf4nf5L6fQnZhI1yvqJ68IX_OEo2Rr8QpdV\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"624\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePlease be advised that the built-in U2F authenticator feature remains in beta status at this point, hence \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e still prints the warning message about the experimental nature of the feature and potential consequences.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/588995753988556500"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/588995753988556500"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/588995753988556500"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$pageName":{"$t":"u2f-ecdsa-vulnerability"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"XSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8137123904179666630"},"published":{"$t":"2013-10-04T15:40:47.280Z"},"updated":{"$t":"2019-09-17T15:29:06.680Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-09-13T20:28:34.742Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging Chromium on Android"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"line-height:19.0909px\"\u003e\u003cfont color\u003d\"#444444\"\u003e\u003cspan style\u003d\"font-size:13.6364px\"\u003eMoved to: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/android_debugging_instructions.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/android_debugging_instructions.md\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/debugging-on-android"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8137123904179666630"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8137123904179666630"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8137123904179666630"}],"author":[{"name":{"$t":"Marcus Bulach"},"email":{"$t":"bulach@chromium.org"}}],"sites$pageName":{"$t":"debugging-on-android"},"sites$revision":{"$t":"34"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/408337301204496940"},"published":{"$t":"2012-11-02T22:30:58.966Z"},"updated":{"$t":"2019-09-17T15:29:03.047Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-03-19T22:57:10.497Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listpage","label":"listpage"}],"title":{"$t":"Chrome OS Graphics Reading List"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1 sites-layout-empty-tile\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromeos-graphics-reading-list"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/408337301204496940"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/408337301204496940"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/408337301204496940"}],"author":[{}],"gs$worksheet":{"name":"Chrome OS Graphics Reading List"},"gs$header":{"row":"1"},"gs$data":{"startRow":"2","gs$column":[{"index":"A","name":"Area"},{"index":"B","name":"Title"},{"index":"C","name":"URL"}]},"gd$feedLink":{"href":"https://sites.google.com/feeds/content/chromium.org/dev?parent\u003d408337301204496940"},"sites$pageName":{"$t":"chromeos-graphics-reading-list"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4758095521516665730"},"published":{"$t":"2012-06-01T17:33:27.889Z"},"updated":{"$t":"2019-09-17T15:28:56.436Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T21:01:13.629Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Time Sources"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eReliably figuring out what time it is on a machine operating in an untrustworthy environment is pretty difficult. Currently we use the following sources:\u003cbr /\u003e\u003col\u003e\u003cli\u003eThe machine's realtime clock, if set\u003c/li\u003e\u003cli\u003ehtpdate(1) pointed at http://www.google.com\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003eUnfortunately, at first boot, the realtime clock may not be set well, and there exist platforms where the realtime clock does not persist across power cycles because it is not battery-backed. We need to get the right time on these machines, mainly to avoid attacks on TLS connections (by setting the date far enough backwards, an attacker might render a TLS certificate that expired valid again). Right now, htpdate(1) refuses to set the date to before the time it was built. There could also be attacks that are opened up by pushing the system clock far enough forward (e.g., causing various system daemons to see files on disk with an apparent modification time far in the future, or causing cryptohomes to not be expired as 'old' when they should be). Currently we have no real protection against these (admittedly limited-scope) attacks. Worse, without a reliable realtime clock, we're always fetching our system time from an unauthenticated source. We have had problems with this in practice - e.g., captive portals that intercept HTTP traffic and return their own headers, sometimes with wildly bogus times in them.\u003cbr /\u003e\u003cbr /\u003eWe should instead use the following sources:\u003cbr /\u003e\u003col\u003e\u003cli\u003etlsdate(1) pointed at https://www.google.com\u003c/li\u003e\u003cli\u003eA file stored in the stateful partition with the last known good time (from tlsdate) and the last known rtc time.\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ci\u003eThe file system itself has a \"last modified\" timestamp that might be more straightforward -- jrbarnette\u003c/i\u003e\u003c/li\u003e\u003cli\u003e\u003ci\u003eThis can get tricky though as the mtime field could be updated for various reasons, some of which are susceptible to the aforementioned attack vectors.  Having dedicated storage would be clear as to its meaning, and the micro optimization here probably doesn't gain much in trading off to complexity.\u003c/i\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eThe machine's rtc\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eOf these sources, we can always consider 1 authoritative if we do get a response, since we'll be doing SSL validation of the whole connection. For situations where we can't do 1 (for example, if we're behind a captive portal that is blocking our TLS connection), we can look at the machine's rtc and compare it against the file mentioned in 2; if the rtc is ahead of the file by some reasonable offset, we can trust the rtc and update the file. If the machine's rtc isn't ahead of the file (or is too far ahead), we probably have no reliable time sources and will have to fall back on setting our time to the last good time stored in the file.\u003c/p\u003e\u003cp\u003eThere are a couple of other sources we could try: on machines with a 3g modem, we might have access to the network time, but doing this is likely to be fraught with peril. There might be other pieces of hardware on the system (the TPM?) that have a notion of what time it is.\u003c/p\u003e\u003cp\u003eThere are some upsides of this crazy plan:\u003c/p\u003e\u003col\u003e\u003cli\u003eDrop htpdate, which is about 850 lines of code that parses HTTP, in exchange for tlsdate, which is 500 lines of code that uses OpenSSL very carefully;\u003c/li\u003e\u003cli\u003eWorks on systems without rtcs\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eAn open question is whether we should accept tlsdate updates if TLS authentication of the connection fails. If we accept unauthenticated updates, we're vulnerable to clock manipulation in the interval (build time, build time + max offset), with max offset most likely being on the order of a few years, but we have a decent chance of getting an at-least-roughly-accurate time. If we reject unauthenticated updates, we may find ourselves in a situation where we have no reliable notion of the time at all, which would force us to default to the build time. Worse, having no reliable time might make it impossible to authenticate to a given captive portal. For a better UX, it's probably wise to just accept the untrusted time, clamping it to the boundaries as needed, since otherwise users might find themselves mysteriously unable to authenticate to a captive portal.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/time-sources"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4758095521516665730"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4758095521516665730"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4758095521516665730"}],"author":[{"name":{"$t":"Elly Fong-Jones"},"email":{"$t":"ellyjones@chromium.org"}}],"sites$pageName":{"$t":"time-sources"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5805659075282129271"},"published":{"$t":"2019-09-12T21:15:42.886Z"},"updated":{"$t":"2019-09-13T21:06:17.003Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-13T21:06:13.209Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Public calendar for meetings discussing new ideas"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:11pt\"\u003eWe strongly recommend that Chromium discussions happen in public forums! \u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBut, if you would like to discuss an idea that is \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot yet public\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e with another Chromium contributor outside of a public forum (eg. in a meeting or a conference), please add the meeting details to this \u003c/span\u003e\u003ca href\u003d\"https://calendar.google.com/calendar/r?cid\u003dY18xODhlMjI4YWZhMnY4dmswdHJzZ25zcmZwYzJkMDRnYWN0bm11cHJjY2tuNjZycmRAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epublic calendar\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd a brief agenda and any documents/links to track progress. \u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEnsure that the discussion is moved to the public forums and reflects any decisions made in such meetings. \u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf you receive interest from another contributor to attend the meeting, please try to accommodate the interest.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:14.6667px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/public-calendar-for-meetings-discussing-new-ideas"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5805659075282129271"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5805659075282129271"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5805659075282129271"}],"author":[{"name":{"$t":"Shruthi Sreekanta"},"email":{"$t":"sshruthi@chromium.org"}}],"sites$pageName":{"$t":"public-calendar-for-meetings-discussing-new-ideas"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7399956187366044116"},"published":{"$t":"2017-08-23T15:15:50.319Z"},"updated":{"$t":"2019-09-13T14:15:56.169Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-09T19:28:45.618Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Arch Linux + Mainline kernel on kevin (Chromebook Plus)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003cstrong\u003eNote:\u003c/strong\u003e Adapted/inspired by \u003ca href\u003d\"https://archlinuxarm.org/platforms/armv7/rockchip/asus-chromebook-flip-c100p\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ethis page\u003c/a\u003e\u003c/div\u003e\r\n\u003ch3 style\u003d\"height:0px\"\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\nThis guide will walk you through installed Arch Linux with a mainline kernel on a USB key suitable for booting on the Chromebook Plus (kevin).\r\n\u003c/div\u003e\r\n\r\n\u003ch3 style\u003d\"height:0px\"\u003e\u003ca name\u003d\"TOC-Preparing-the-USB-key\" /\u003ePreparing the USB key\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003ePlug the USB key into your \u003cb\u003echromebook\u003c/b\u003e and run the following commands in the shell to create a new partition table and 2 partitions - one for the kernel and another for rootfs.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003cdiv\u003e\u003ccode\u003e; \u003c/code\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003eumount /dev/sda*\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; \u003c/code\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003efdisk /dev/sda\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003eCommand (m for help): g\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003eCommand (m for help): w\u003c/span\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003eCommand (m for help): q\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/span\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\r\n\u003cdiv\u003e; cgpt create /dev/sda\u003c/div\u003e\r\n\u003cdiv\u003e; cgpt add -i 1 -t kernel -b 8192 -s 65536 -l Kernel -S 1 -T 5 -P 10 /dev/sda\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e; cgpt show /dev/sda\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e       \u003cb\u003estart\u003c/b\u003e        size    part  contents\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e           0           1          PMBR\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e           1           1          Pri GPT header\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e        8192       65536       1  Label: \"Kernel\"\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e                                  Type: ChromeOS kernel\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e                                  UUID: A1E0BF2A-3687-A949-86F8-40507B1D0756\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e                                  Attr: priority\u003d10 tries\u003d5 successful\u003d1\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e       73728   122470755       2  Label: \"Root\"\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e                                  Type: Linux data\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e                                  UUID: A3590EA0-A89B-434F-B6C3-902C0A87CDFB\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e   \u003cb\u003e\u003ci\u003e122544483\u003c/i\u003e\u003c/b\u003e          32          \u003cb\u003eSec GPT table\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e   122544515           1          Sec GPT header\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe numbers above will differ depending on the size of your USB key. Grab the value under the \"start\" column for the \"Sec GPT table\" row and insert it in the command below (\u0026lt;start_value\u0026gt;)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e; cgpt add -i 2 -t data -b 73728 -s `expr \u003cb\u003e\u0026lt;start_value\u0026gt;\u003c/b\u003e - 73728` -l Root /dev/sda\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n; sudo partx -a /dev/sda\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n; sudo mkfs.ext4 /dev/sda2\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eYour USB key is now formatted in such a way that the chromebook can book from it. Next step is to put something bootable on it.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Download-Arch-rootfs\" /\u003eDownload Arch rootfs\u003c/h3\u003e\r\n\u003cdiv\u003eThe following will download the latest Arch Linux image for gru-kevin and flash the rootfs partition.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; cd /tmp\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; wget http://os.archlinuxarm.org/os/ArchLinuxARM-gru-latest.tar.gz\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; mkdir root\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; sudo mount /dev/sda\u003c/code\u003e\u003ccode\u003e2 root\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; sudo tar -xf ArchLinuxARM-gru-latest.tar.gz -C root\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIn order to test the image and your partition table, flash the kernel partition from the Arch tarball to your USB key\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003ccode\u003e; sudo dd if\u003droot/boot/vmlinux.kpart of\u003d/dev/sda1\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003ccode\u003e; sync\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eFinally, unmount the root partition:\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; umount root\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eUnplug the USB key from your workstation and test boot it on your kevin by pressing Ctrl+U at the developer screen. The device should boot to a login prompt (user: root, passwd: root).\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e; reboot\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Preparing-the-kernel\" /\u003ePreparing the kernel\u003c/h3\u003e\r\n\u003cdiv\u003eBack on your workstation, sync a linux-next kernel for maximum freshness.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cstrike\u003eApply the following patches to enable display:\u003c/strike\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://github.com/mmind/linux-rockchip/commit/9a35625d79210a8a919fdf6c8f878520134c3a6c\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003e\u003cstrike\u003ehttps://github.com/mmind/linux-rockchip/commit/9a35625d79210a8a919fdf6c8f878520134c3a6c\u003c/strike\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cstrike\u003e\u003ca href\u003d\"https://github.com/mmind/linux-rockchip/commit/0b50af4d2440404d5e10303cc84e43e84f84f374\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttps://github.com/mmind/linux-rockchip/commit/0b50af4d2440404d5e10303cc84e43e84f84f374\u003c/a\u003e\u003c/strike\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(234,153,153)\"\u003e\u003cb\u003eseanpaul: \u003c/b\u003e\u003c/span\u003e^^ These links are broken now (thanks to Brian Carnes for the report). I don't remember what they did, but I also don't think they're needed any longer since rockchip display support is all in mainline.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Building-the-kernel\" /\u003eBuilding the kernel\u003c/h3\u003e\r\n\u003cdiv\u003eYou'll need to grab the kernel.keyblock and kernel_data_key.vbprivk files in order to package the kernel. They're stored in Arch Linux's PKGBUILDs repo on github \u003ca href\u003d\"https://github.com/archlinuxarm/PKGBUILDs/tree/master/core/linux-gru\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehere\u003c/a\u003e. I put them in \u0026lt;kernel_root\u0026gt;/resources/gru-kevin/.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eAlso stored in \u0026lt;kernel_root\u0026gt;/resources/gru-kevin is the rk3399-gru-kevin.its file. Create and copy/paste the following into it:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e/dts-v1/;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e/ {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003edescription \u003d \"Chrome OS kernel image with one or more FDT blobs\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003e#address-cells \u003d \u0026lt;1\u0026gt;;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003eimages {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003ekernel@1 {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003edata \u003d /incbin/(\"../../.build_arm64/arch/arm64/boot/Image\");\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003etype \u003d \"kernel_noload\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003earch \u003d \"arm64\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003eos \u003d \"linux\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003ecompression \u003d \"none\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003eload \u003d \u0026lt;0\u0026gt;;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003eentry \u003d \u0026lt;0\u0026gt;;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003efdt@1 {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003edescription \u003d \"rk3399-gru-kevin\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003edata \u003d /incbin/(\"../../.build_arm64/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dtb\");\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003etype \u003d \"flat_dt\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003earch \u003d \"arm64\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003ecompression \u003d \"none\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003ehash@1 {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\t\u003c/span\u003e\u003ccode\u003ealgo \u003d \"sha1\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003econfigurations {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003edefault \u003d \"conf@1\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003econf@1 {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003ekernel \u003d \"kernel@1\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\t\u003c/span\u003e\u003ccode\u003efdt \u003d \"fdt@1\";\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:10pt\" /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eGrab my build script from \u003ca href\u003d\"https://github.com/atseanpaul/build_kernel\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003egithub\u003c/a\u003e, and add a build.ini file in the kernel root with the following (changing the bold parts to suit your environment):\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e[target]\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; From /dev/by-partuuid\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ekernel_part_uuid\u003d\u003cb\u003e27c7f096-0f26-d544-a142-7273e6dcf01e\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; From /dev/by-uuid\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eroot_uuid\u003d\u003cb\u003e89d88389-c5c3-4f88-9ea6-2efd6124bc49\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e[build]\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; Choose one of these, not both. defconfig builds from an existing defconfig,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; whereas config_file points to a config file that will used verbatim\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003edefconfig\u003ddefconfig\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e;config_file\u003d\u0026lt;path to config file\u0026gt;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; For the kernel build command; required\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ekernel_arch\u003darm64\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecross_compile\u003daarch64-linux-gnu-\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ejobs\u003d40\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; vbutil_kernel arguments, optional\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003evbutil_kernel\u003d\u003cb\u003e/home/seanpaul/s/cros/chroot/usr/bin/vbutil_kernel\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ekeyblock\u003d\u003cb\u003eresources/gru-kevin/kernel.keyblock\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003edata_key\u003d\u003cb\u003eresources/gru-kevin/kernel_data_key.vbprivk\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecmdline\u003dconsole\u003dtty1 console\u003dttyS2,115200n8 earlyprintk\u003dttyS2,115200n8 init\u003d/sbin/init root\u003dPARTUUID\u003d%U/PARTNROFF\u003d1 rootwait rw noinitrd\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003evbutil_arch\u003daarch64\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; mkimage arguments, optional\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003emkimage\u003d\u003cb\u003e/home/seanpaul/s/cros/chroot/usr/bin/mkimage\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eits_file\u003d\u003cb\u003eresources/gru-kevin/rk3399-gru-kevin.its\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e; post-build options\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003einstall_modules\u003dyes\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003einstall_dtbs\u003dyes\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003egenerate_htmldocs\u003dno\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSimply run the build_kernel.py script from the kernel root directory to build and flash your kernel. If all goes well, you should now have a USB key that will boot a mainline kernel with Arch Linux rootfs.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7399956187366044116"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7399956187366044116"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7399956187366044116"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$pageName":{"$t":"mainline-kernel-on-kevin-chromebook-plus"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7075983256552627031"},"published":{"$t":"2017-10-27T19:43:10.195Z"},"updated":{"$t":"2019-09-05T00:19:36.721Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-09-05T00:19:34.378Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Firmware / EC Write Protection"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOn customer-ship devices, read-only \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/custom-firmware\"\u003eAP firmware\u003c/a\u003e and \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/ec-development\"\u003eembedded controller firmware\u003c/a\u003e is write-protected. By design, this write protection cannot be removed without physical access to the device.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eApplication Processor (AP) Firmware\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eAP firmware (also known as \"SOC firmware\", \"host firmware\", \"main firmware\" or even \"BIOS\") typically resides on a SPI ROM. Protection registers on the SPI ROM are programmed to protect the read-only region, and these registers normally cannot be modified while the SPI ROM WP (write protect) pin is asserted. This pin is asserted through various physical means (see below), but with effort, users can unprotect devices they own.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eEmbedded Controller (EC) Firmware\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eThe Chrome OS Embedded Controller (EC) typically has a WP input pin driven by the same hardware that generates SOC firmware write protect. While this pin is asserted, certain debug features (eg. arbitrary I2C access through host commands) are locked out. Some ECs \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/ec-development/ec-image-geometry-spec\"\u003eload code from external storage\u003c/a\u003e, and for these ECs, RO protection works similar to SOC firmware RO protection (WP pin is asserted to EC SPI ROM). Other ECs use internal flash, and these ECs emulate SPI ROM protection registers, disabling write access to certain regions while the WP pin is asserted.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eMethods of Asserting Write Protect\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThroughout the history of Chrome OS devices, three main methods have been implemented for asserting (and removing) write protect:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSwitch - a toggle switch asserts WP to the SOC firmware SPI ROM and EC. WP can be deasserted by disassembling the device and flipping the switch.\u003c/li\u003e\u003cli\u003eScrew - a screw shorts a pad on the PCB. While this screw is inserted, WP is asserted. WP can be deasserted by disassembling the device and removing this special screw.\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/ec/+/master/board/cr50/\"\u003ecr50\u003c/a\u003e - a special security chip asserts the WP signal. While a battery is present on the device, the WP signal will be asserted. Disassembling the device and physically disconnecting the battery causes WP to be deasserted.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eMore information about which protection method is used for a particular device, and where to locate the switch / screw, is available on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices\"\u003edeveloper info page\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eDisabling Write Protect for Screw / Switch Protection\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eDisassemble the device, locate the WP screw / switch, and remove it.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eReassemble the device, then boot to \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/developer-mode\"\u003edeveloper mode\u003c/a\u003e.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eTo disable SOC firmware protection, run \"\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/cros-flashrom\"\u003eflashrom\u003c/a\u003e -p host --wp-disable\u003c/font\u003e\". To disable EC firmware protection (external storage), run \"\u003cfont face\u003d\"courier new, monospace\"\u003eflashrom -p ec --wp-disable\u003c/font\u003e\". It's not possible to disable EC firmware WP once enabled for ECs with internal storage. Instead, RO firmware must be reflashed while WP is deasserted. RO firmware will then be writable, regardless of the state of WP.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eNow that SPI / EC protection registers are cleared, the screw / switch can be re-inserted and the read-only region of SOC / EC firmware will remain writable.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eDisabling Write Protect for cr50\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you have a \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/master/docs/ccd.md#suzyq-suzyqable\"\u003esuzyQ\u003c/a\u003e, you can disable write protect without opening the case. You can \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/ec/+/master/docs/case_closed_debugging_cr50.md#ccd-setup\"\u003eenable Case-Closed Debugging (CCD)\u003c/a\u003e and then \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/ec/+/master/docs/case_closed_debugging_cr50.md#wp-control\"\u003euse a cr50 console command to disable write protect\u003c/a\u003e. The write protect command is only accessible through suzyQ.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you don't want to go through the ccd open process or don't have a suzyQ, you can open the case and remove the battery to disable write protect. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eDisassemble the device, locate the battery connector, remove the battery connector from the PCB to disconnect the battery.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eReassemble the device, insert the original OEM charger (necessary since the battery is no longer providing power to the system), then boot to developer mode.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eSee (3) above, commands to disable protection are identical.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eDisassemble, re-attach the battery, then reassemble.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8191782580396249944"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/firmware-ec-write-protection"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7075983256552627031"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7075983256552627031"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7075983256552627031"}],"author":[{"name":{"$t":"Shawn N"},"email":{"$t":"shawnn@chromium.org"}}],"sites$pageName":{"$t":"firmware-ec-write-protection"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/618862570500136737"},"published":{"$t":"2014-12-02T04:39:49.328Z"},"updated":{"$t":"2019-09-01T17:48:57.919Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-12-02T18:43:37.838Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"HSTS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eSee \u003ca href\u003d\"https://www.chromium.org/hsts/\"\u003echromium.org/hsts\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cimg src\u003d\"http://www.google.com/chart?chc\u003dsites\u0026amp;cht\u003dd\u0026amp;chdp\u003dsites\u0026amp;chl\u003d%5B%5BGoogle+Gadget'%3D20'f%5Cv'a%5C%3D0'10'%3D499'0'dim'%5Cbox1'b%5CF6F6F6'fC%5CF6F6F6'eC%5C0'sk'%5C%5B%22Page+Redirect%22'%5D'a%5CV%5C%3D12'f%5C%5DV%5Cta%5C%3D10'%3D0'%3D500'%3D197'dim'%5C%3D10'%3D10'%3D500'%3D197'vdim'%5Cbox1'b%5Cva%5CF6F6F6'fC%5CC8C8C8'eC%5C'a%5C%5Do%5CLauto'f%5C\u0026amp;sig\u003dRmVa16ZL_UQQmL8IDyOROP2fErI\" data-igsrc\u003d\"http://64.gmodules.com/ig/ifr?mid\u003d64\u0026amp;synd\u003dtrogedit\u0026amp;url\u003dhttps%3A%2F%2Fwww.chromium.org%2Fsts%2Fredirect.xml\u0026amp;h\u003d200\u0026amp;w\u003d100%25\" data-type\u003d\"ggs-gadget\" data-props\u003d\"align:left;borderTitle:Page Redirect;height:200;igsrc:http#58//64.gmodules.com/ig/ifr?mid\u003d64\u0026amp;synd\u003dtrogedit\u0026amp;url\u003dhttps%3A%2F%2Fwww.chromium.org%2Fsts%2Fredirect.xml\u0026amp;h\u003d200\u0026amp;w\u003d100%25;mid:64;scrolling:no;showBorder:false;showBorderTitle:null;spec:https#58//www.chromium.org/sts/redirect.xml;width:100%;\" width\u003d\"500\" height\u003d\"200\" style\u003d\"display:block;text-align:left;margin-right:auto;\" class\u003d\"igm\" /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/sts"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/618862570500136737"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/618862570500136737"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/618862570500136737"}],"author":[{"name":{"$t":"Lucas Garron"},"email":{"$t":"lgarron@chromium.org"}}],"sites$pageName":{"$t":"sts"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"WSl7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/738999279112213088"},"published":{"$t":"2010-02-26T20:08:20.894Z"},"updated":{"$t":"2019-09-01T17:48:50.912Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-02-13T16:29:29.398Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"HTTP Strict Transport Security"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eOne of the several new features in Chrome is the addition of \u003ca href\u003d\"https://tools.ietf.org/html/rfc6797\" rel\u003d\"nofollow\"\u003eHTTP Strict Transport Security\u003c/a\u003e. HSTS allows a site to request that it always be contacted over HTTPS. HSTS is supported in Google Chrome, \u003ca href\u003d\"https://blog.mozilla.org/security/2012/11/01/preloading-hsts/\" rel\u003d\"nofollow\"\u003eFirefox\u003c/a\u003e, Safari, Opera, Edge and \u003ca href\u003d\"http://blogs.msdn.com/b/ie/archive/2015/02/16/http-strict-transport-security-comes-to-internet-explorer.aspx\" rel\u003d\"nofollow\"\u003eIE\u003c/a\u003e (caniuse.com has a \u003ca href\u003d\"http://caniuse.com/#feat\u003dstricttransportsecurity\" rel\u003d\"nofollow\"\u003ecompatibility matrix\u003c/a\u003e).\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eThe issue that HSTS addresses is that users tend to type \u003cfont face\u003d\"'courier new', monospace\"\u003ehttp://\u003c/font\u003e at best, and omit the scheme entirely most of the time. In the latter case, browsers will insert \u003cfont face\u003d\"'courier new', monospace\"\u003ehttp://\u003c/font\u003e for them.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHowever, HTTP is insecure. An attacker can grab that connection, manipulate it and only the most eagle eyed users might notice that it redirected to \u003cfont face\u003d\"'courier new', monospace\"\u003ehttps://www.bank0famerica.com\u003c/font\u003e or some such. From then on, the user is under the control of the attacker, who can intercept passwords etc at will.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAn HSTS enabled server can include the following header in an HTTPS reply:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    Strict-Transport-Security: max-age\u003d16070400; includeSubDomains\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWhen the browser sees this, it will remember, for the given number of seconds, that the current domain should only be contacted over HTTPS. In the future, if the user types \u003cfont face\u003d\"'courier new', monospace\"\u003ehttp://\u003c/font\u003e or omits the scheme, HTTPS is the default. In fact, all requests for URLs in the current domain will be redirected to HTTPS. (So you have to make sure that you can serve them all!).\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFor more details, see the \u003ca href\u003d\"https://tools.ietf.org/html/rfc6797\" rel\u003d\"nofollow\"\u003especification\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003ePreloaded HSTS sites\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThere is still a window where a user who has a fresh install, or who wipes out their local state, is vulnerable. Because of that, Chrome maintains an \"HSTS Preload List\" (and other browsers maintain lists based on the Chrome list). These domains will be configured with HSTS out of the box. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf you own a site that you would like to see included in the preloaded HSTS list you can submit it at \u003ca href\u003d\"https://hstspreload.org/\"\u003ehttps://hstspreload.org\u003c/a\u003e.\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003eA selected subset of the members of the preloaded HSTS list:\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eGoogle\u003c/li\u003e\u003cli\u003ePaypal\r\n\u003c/li\u003e\u003cli\u003eTwitter\u003c/li\u003e\u003cli\u003eSimple\u003c/li\u003e\u003cli\u003eLinode\u003c/li\u003e\u003cli\u003eStripe\u003c/li\u003e\u003cli\u003eLastpass\u003c/li\u003e\u003c/ul\u003e\r\nCheck the source for the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/net/http/transport_security_state_static.json\"\u003efull list\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e(To see the version of the list in a particular version of Chrome\u003cfont face\u003d\"arial, sans-serif\"\u003e, visit \u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/__branch_commit__/net/http/transport_security_state_static.json\"\u003ethis URL\u003c/a\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003ewith \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e__branch_commit__\u003c/font\u003e replaced by the hash of the relevant build from \u003ca href\u003d\"https://omahaproxy.appspot.com/\"\u003ehere\u003c/a\u003e.)\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/hsts"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/738999279112213088"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/738999279112213088"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/738999279112213088"}],"author":[{"name":{"$t":"Adam Langley"},"email":{"$t":"agl@chromium.org"}}],"sites$pageName":{"$t":"hsts"},"sites$revision":{"$t":"50"}},{"gd$etag":"\"KXsmYD1ZHg..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4433083908861966341"},"published":{"$t":"2013-01-17T23:17:44.451Z"},"updated":{"$t":"2019-08-30T20:17:57.552Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-30T20:17:54.588Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Security FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-size:xx-large;background-color:transparent\"\u003eThe \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/faq.md\"\u003ecanonical version of the FAQ is now in the Chromium source tree\u003c/a\u003e.\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4433083908861966341"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4433083908861966341"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4433083908861966341"}],"author":[{"name":{"$t":"Chris Palmer"},"email":{"$t":"palmer@chromium.org"}}],"sites$pageName":{"$t":"security-faq"},"sites$revision":{"$t":"108"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3396809678147596789"},"published":{"$t":"2019-05-22T23:21:19.973Z"},"updated":{"$t":"2019-08-29T17:27:33.732Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-29T17:27:30.436Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"CBI: CrOS Board Info"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch1 style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-This-page-has-been-moved-to-here.\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eThis page has been moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/design_docs/cros_board_info.md\"\u003ehere\u003c/a\u003e.\u003c/font\u003e\u003c/h1\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h1\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cbi-cros-board-info"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3396809678147596789"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3396809678147596789"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3396809678147596789"}],"author":[{"name":{"$t":"Daisuke Nojiri"},"email":{"$t":"dnojiri@chromium.org"}}],"sites$pageName":{"$t":"cbi-cros-board-info"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1338468147941872365"},"published":{"$t":"2018-07-06T23:17:57.030Z"},"updated":{"$t":"2019-08-27T20:20:13.207Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-27T20:20:10.434Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Closed Case Debugging (CCD)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-This-page-has-moved-to-https:-chromium.googlesource.com-chromiumos-third_party-hdctools-master-docs-ccd.md.-Please-update-the-link-that-brought-you-here.\" /\u003e\u003cfont color\u003d\"#ff0000\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/master/docs/ccd.md\" style\u003d\"background-color:transparent\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/hdctools/+/master/docs/ccd.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/ccd"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1338468147941872365"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1338468147941872365"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1338468147941872365"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$pageName":{"$t":"ccd"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4487573598219365124"},"published":{"$t":"2018-02-01T16:50:15.523Z"},"updated":{"$t":"2019-08-27T16:30:33.739Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-27T16:30:31.142Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"XSS Auditor"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Note:-An-Intent-to-Deprecate-and-Remove-the-XSS-Auditor-was-published-on-15-July-2019.-The-feature-was-permanently-disabled-on-5-August-2019-and-shortly-after-fully-removed-for-Chrome-78.-\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003eNote\u003c/font\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e: \u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/TuYw-EZhO9g/blGViehIAwAJ\"\u003eAn Intent to Deprecate and Remove the XSS Auditor\u003c/a\u003e was published on 15-July-2019. The feature was \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/73d3b625e731badaf9ad3b8f3e6cdf951387a589\"\u003epermanently disabled\u003c/a\u003e on 5-August-2019 and shortly after fully \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d968591#c10\"\u003eremoved\u003c/a\u003e for \u003c/span\u003e\u003cfont color\u003d\"#ff0000\"\u003eChrome 78\u003c/font\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e. \u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Design\" /\u003eDesign\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px\"\u003eThe XSS Auditor runs during the HTML parsing phase and attempts to find \u003ca href\u003d\"https://en.wikipedia.org/wiki/Cross-site_scripting#Reflected_(non-persistent)\" rel\u003d\"nofollow\"\u003ereflections\u003c/a\u003e from the request to the response body. It does not attempt to mitigate Stored or DOM-based XSS attacks. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px\"\u003eIf a possible reflection has been found, Chrome may ignore (neuter) the specific script, or it may block the page from loading with an \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:12.8px\"\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003eERR_BLOCKED_BY_XSS_AUDITOR error page\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe original design \u003c/span\u003e\u003ca href\u003d\"http://www.collinjackson.com/research/xssauditor.pdf\" style\u003d\"background-color:transparent;color:rgb(17,85,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://www.collinjackson.com/research/xssauditor.pdf\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e is the best place to start. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe current rules are an evolved response to things observed in the wild.\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003ch2 style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Performance\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePerformance\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:12.8px\"\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent\"\u003eProcessing costs are essentially zero unless the URL or POST body includes any of the four characters \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" face\u003d\"courier new, monospace\"\u003e\u003cb style\u003d\"background-color:transparent\"\u003e\" \u0026gt; \u0026lt; \u003c/b\u003e\u003cb style\u003d\"background-color:transparent\"\u003e'\u003c/b\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent\"\u003e. When those characters are found, \u003c/span\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent\"\u003ewe only invoke heavy processing on those attributes that might be dangerous. This stands in contrast to the XSS Filter in Internet Explorer, which runs costly regular expressions.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34)\"\u003e\u003cdiv style\u003d\"font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003ch2 style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-False-Negatives-Bypasses-and-bugs-\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFalse Negatives (Bypasses and bugs)\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBypasses are \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/faq.md#Are-XSS-filter-bypasses-considered-security-bugs\" style\u003d\"background-color:transparent\"\u003enot considered security bugs\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e, but should be logged against the \u003c/span\u003e\u003ca href\u003d\"https://goo.gl/4xSVhV\" style\u003d\"background-color:transparent\"\u003eXSS Auditor component\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e as functional issues. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eStored (attacks where the script is stored in a site's database, for instance) and DOM-based XSS attacks (where JavaScript on the page unsafely manipulates content retrieved from document.location.href, for instance) are out-of-scope and do not need to be logged.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"color:rgb(34,34,34);font-family:Arial,Verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-False-Positives\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFalse Positives\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Unlike-implementations-in-some-other-browsers-Chrome-s-XSS-Auditor-runs-on-same-origin-navigations-this-increases-the-risk-of-a-false-positive-but-provides-better-protection-against-multi-stage-attacks.\" /\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-weight:400;font-size:12.8px;font-family:arial,sans-serif\" /\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:400\"\u003eUnlike implementations in some other browsers, Chrome's XSS Auditor runs on same-origin navigations; this increases the risk of a false-positive but provides better protection against multi-stage attacks.\u003c/span\u003e\u003c/div\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-The-XSS-Auditor-looks-for-reflected-content-within-the-context-of-executable-script-nodes.-By-checking-for-reflections-only-in-contexts-where-script-may-be-executed-the-Auditor-avoids-many-types-of-false-positive.-Because-text-that-is-reflected-into-a-non-\" /\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400;background-color:transparent\"\u003eThe XSS Auditor looks for reflected content within the context of executable (script) nodes. By checking for reflections only in contexts where script may be executed, the Auditor avoids many types of false positive. Because text that is reflected into a non-executable context (e.g. into a \u0026lt;textarea\u0026gt; element) does not trigger the Auditor. \u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400\"\u003eHowever, the Auditor has no way of knowing whether a given script block which appears in both the request and the response was truly reflected from the request to the response. For instance, \u003ca href\u003d\"http://webdbg.com/test/xss/alert12345.aspx\" rel\u003d\"nofollow\"\u003econsider this page\u003c/a\u003e that \u003ci\u003ealways \u003c/i\u003econtains the markup \u003c/span\u003e\u0026lt;script\u0026gt;alert(\"12345\");\u0026lt;/script\u0026gt;\u003cspan style\u003d\"font-weight:normal\"\u003e. If the user navigates to this page normally, the Auditor does not trigger. However, if the user navigates to this page \u003ca href\u003d\"http://webdbg.com/test/xss/auditor.aspx\" rel\u003d\"nofollow\"\u003eusing a URL\u003c/a\u003e whose query string contains \u003c/span\u003e?query\u003d\u003cspan style\u003d\"background-color:transparent\"\u003e\u0026lt;script\u0026gt;alert(\"12345\");\u0026lt;/script\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-weight:400;background-color:transparent\"\u003e, the Auditor concludes that the script appearing within the response page may be a reflection from the request (an XSS attack), and the XSS Auditor blocks the response.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400;background-color:transparent\"\u003eIn the past, the XSS Auditor defaulted to neutering only the potentially-reflected block, leaving the rest of the page intact. However, this creates a vulnerability whereby an attacker may \"\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d825675\"\u003esnipe\u003c/a\u003e\" an unwanted block of script from a victim page by sending the script-to-kill in the request body. To mitigate such attacks, as of Chrome 57, the XSS Auditor \u003ca href\u003d\"https://www.chromestatus.com/features/5748927282282496\"\u003enow blocks\u003c/a\u003e the response entirely. \u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:400\"\u003eIn some scenarios, a site legitimately wishes to send SCRIPT markup from one page to another where that markup may already appear (for instance, in the HTML Editing UI of a CMS or bulletin board site). In such cases, the site developers should either encode the content before transferring it (e.g. encode the content as base64, such that it is not identified as a reflection), or by opting out of the XSS Auditor by setting the HTTP response header.\u003c/span\u003e\u003c/div\u003e\u003c/h2\u003e\u003ch2 style\u003d\"color:rgb(34,34,34)\"\u003e\u003ca name\u003d\"TOC-Control-via-Response-Header\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eControl via Response Header\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003eSites may control the XSS Auditor's behavior using the \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent\"\u003eX-XSS-Protection\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e response header, either disabling the feature or changing its mode. \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003eThis Response header disables the Auditor:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e   \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent\"\u003e   X-XSS-Protection: 0\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003eThis Response header enables the Auditor and sets the mode to \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent\"\u003eneuter\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e   \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent\"\u003e   X-XSS-Protection: 1\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003eThis Response header enables the Auditor and sets the mode to \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent\"\u003eblock \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e(the default):\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e   \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent\"\u003e   X-XSS-Protection: 1; mode\u003dblock\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhen the feature is enabled (state \"1\"), Chrome's XSS Auditor allows the header to specify a \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ereport \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eURI to which violation reports should be sent. In Chrome 64 and 65, that URI must be same-origin to the page, but that limit was \u003ca href\u003d\"https://crbug.com/811440\"\u003eremoved in Chrome 66\u003c/a\u003e. If your report URL includes a semicolon, be sure to \u003ca href\u003d\"https://crbug.com/825557\"\u003ewrap the URL in quotation marks\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"color:rgb(34,34,34);font-size:12.8px;background-color:transparent\"\u003e   \u003c/font\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:courier new,monospace;background-color:transparent\"\u003e   X-XSS-Protection: 1; mode\u003dblock; \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:12.8px\"\u003e\u003cfont color\u003d\"#222222\" face\u003d\"courier new, monospace\"\u003ereport\u003dhttps://example.com/log.cgi\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;color:rgb(34,34,34);font-size:12.8px\"\u003e   \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(34,34,34);font-size:12.8px;font-family:courier new,monospace\"\u003e   X-XSS-Protection: 1; \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:12.8px\"\u003e\u003cfont color\u003d\"#222222\" face\u003d\"courier new, monospace\"\u003ereport\u003d\"https://example.com/log.cgi?jsessionid\u003d132;abc\"\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debugging-via-View-Source\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDebugging via View Source\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-If-the-XSS-Auditor-blocks-or-modifies-a-response-because-it-detected-reflected-script-the-View-Source-CTRL-U-view-for-that-page-will-point-to-the-script-that-was-reflected:\" /\u003e\u003cdiv style\u003d\"font-weight:400;font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf the XSS Auditor blocks or modifies a response because it detected reflected script, the View Source (CTRL+U) view for that page will point to the script that was reflected:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:400;font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:400;font-size:12.8px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/xss-auditor/XSSAuditorViewSource.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg alt\u003d\"View-Source view highlights the reflected text\" border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1518799148108/developers/design-documents/xss-auditor/XSSAuditorViewSource.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Code\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCode\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe code for the XSS Auditor feature can be found in Blink at \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/html/parser/xss_auditor.h\"\u003eXSSAuditor.h\u003c/a\u003e and \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/html/parser/xss_auditor_delegate.h?\"\u003eXSSAuditorDelegate.h\u003c/a\u003e. \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003ePerformance tests can be found \u003c/span\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/perf_tests/xss_auditor/\" style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003ehere\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003ca name\u003d\"TOC-History\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eHistory\u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe XSS Auditor was introduced \u003ca href\u003d\"https://blog.chromium.org/2010/01/security-in-depth-new-security-features.html\"\u003ein Chrome 4\u003c/a\u003e in 2010.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-size:12.8px;font-family:arial,sans-serif\"\u003e\u003ch2 style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Abuse\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAbuse\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe XSS Auditor works by matching request data to data in a response page, which may be cross-origin. This creates the possibility that the XSS Auditor may be abused by an attacker to determine the content of a cross-origin page, a violation of Same Origin Policy. \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIn a canonical attack, the attacker frames a victim page with a string of interest in it, then attempts to determine that string by making a series of successive guesses until it \u003cb\u003edetects blocking\u003c/b\u003e by the XSS Auditor. If the XSS Auditor blocks the page, the attacker concludes that their guess was correct. This form of attack is constrained to pages matching certain \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d176137#c17\"\u003ecriteria\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003eTo combat this threat, the attacker should not be able to detect that the Auditor has blocked loading of the page. Most known \u003ca href\u003d\"https://crbug.com/176137\"\u003edetection\u003c/a\u003e \u003ca href\u003d\"https://crbug.com/396544\"\u003emechanisms\u003c/a\u003e have been fixed, although a website with a content injection vulnerability may remain \u003ca href\u003d\"https://crbug.com/396544#c14\"\u003evulnerable\u003c/a\u003e and \u003ca href\u003d\"http://blog.portswigger.net/2015/08/abusing-chromes-xss-auditor-to-steal.html\" rel\u003d\"nofollow\"\u003equirks of same-origin-policy\u003c/a\u003e may permit detection of blocking.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/xss-auditor"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4487573598219365124"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4487573598219365124"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4487573598219365124"}],"author":[{"name":{"$t":"Eric Lawrence"},"email":{"$t":"elawrence@chromium.org"}}],"sites$pageName":{"$t":"xss-auditor"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8904869953552818832"},"published":{"$t":"2014-02-05T05:58:27.281Z"},"updated":{"$t":"2019-08-26T15:51:09.708Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-26T15:51:06.638Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Shell Style Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1310.77px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Moved-to-https:-chromium.googlesource.com-chromiumos-docs-master-styleguide-shell.md.-Please-update-the-link-that-brought-you-here-with-the-new-location.\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMoved to\u003c/font\u003e\u003c/span\u003e \u003c/font\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/styleguide/shell.md\" style\u003d\"font-size:10pt;font-weight:normal\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/styleguide/shell.md\u003c/a\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:small;color:rgb(255,0,0);font-weight:normal\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:small;color:rgb(255,0,0);font-weight:400\"\u003ePlease update the link that brought you here with the new location.\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv /\u003e\u003ca name\u003d\"page-comments\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/shell-style-guidelines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8904869953552818832"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8904869953552818832"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8904869953552818832"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"shell-style-guidelines"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6047146098508869309"},"published":{"$t":"2013-08-27T15:07:13.271Z"},"updated":{"$t":"2019-08-13T23:05:12.907Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-13T23:05:09.909Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"CRLSets"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e(This page is intended for Certificate Authorities who wish to know about Chromium's certificate revocation behaviour.)\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCRLSets (\u003ca href\u003d\"https://www.imperialviolet.org/2012/02/05/crlsets.html\" rel\u003d\"nofollow\"\u003ebackground\u003c/a\u003e) are primarily a means by which Chrome can quickly block certificates in emergency situations. As a secondary function they can also contain some number of non-emergency revocations. These latter revocations are obtained by crawling CRLs published by CAs.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnline (i.e. OCSP and CRL) checks are not, generally, performed by Chrome. They can be enabled by policy and, in some cases, the underlying system certificate library always performs these checks no matter what Chromium does.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe Chromium source code that implements CRLSets is, of course, \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/net/cert/crl_set.cc\"\u003epublic\u003c/a\u003e. But the process by which they are generated is not.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eWe maintain an internal list of crawled CRLs which are intended to cover intermediate revocations. The CRLs \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003efrom that set go to make up the published CRLSet. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eCRLs on the list are fetched infrequently (at most once every few \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ehours) and verified against the correct signing certificate for that \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eCRL.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe current CRLSet can be fetched and dumped out using the code at \u003ca href\u003d\"https://github.com/agl/crlset-tools\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003ehttps://github.com/agl/crlset-tools\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe version of CRLSet being used by Chrome can be inspected by navigating to chrome://components:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:inline;float:left;margin:5px 10px 0px 0px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/crlsets/CRLSetComponents.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1565733212703/Home/chromium-security/crlsets/CRLSetComponents.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/crlsets"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6047146098508869309"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6047146098508869309"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6047146098508869309"}],"author":[{"name":{"$t":"Adam Langley"},"email":{"$t":"agl@chromium.org"}}],"sites$pageName":{"$t":"crlsets"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/428827640718081088"},"published":{"$t":"2019-08-13T20:51:30.650Z"},"updated":{"$t":"2019-08-13T21:53:32.703Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-13T21:53:32.681Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"CRLSetComponents.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/428827640718081088"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6047146098508869309"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/crlsets/CRLSetComponents.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/428827640718081088"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/428827640718081088"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/428827640718081088"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/428827640718081088"}],"author":[{"name":{"$t":"Andrew Whalley"},"email":{"$t":"awhalley@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4434570074566878669"},"published":{"$t":"2018-07-26T18:02:45.177Z"},"updated":{"$t":"2019-08-12T15:25:14.893Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-12T15:25:11.299Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Servo V4"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1295.38px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eTThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servov4"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4434570074566878669"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4434570074566878669"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4434570074566878669"}],"author":[{"name":{"$t":"Nick Sanders"},"email":{"$t":"nsanders@chromium.org"}}],"sites$pageName":{"$t":"servov4"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2836604984678896805"},"published":{"$t":"2018-07-26T18:03:54.494Z"},"updated":{"$t":"2019-08-12T15:24:42.157Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-12T15:24:37.825Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Servo Micro"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1295.38px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servomicro"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2836604984678896805"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2836604984678896805"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2836604984678896805"}],"author":[{"name":{"$t":"Nick Sanders"},"email":{"$t":"nsanders@chromium.org"}}],"sites$pageName":{"$t":"servomicro"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6068313404116893682"},"published":{"$t":"2018-08-31T21:12:41.108Z"},"updated":{"$t":"2019-08-12T15:24:05.630Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-12T15:24:00.842Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Servo V2"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1295.38px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servo-v2"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6068313404116893682"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6068313404116893682"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6068313404116893682"}],"author":[{"name":{"$t":"Debosmita Das"},"email":{"$t":"ddas@chromium.org"}}],"sites$pageName":{"$t":"servo-v2"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"Xil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"},"published":{"$t":"2014-09-12T20:30:02.660Z"},"updated":{"$t":"2019-08-12T15:23:10.938Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-12T15:23:07.586Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Servo"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1511019955850917035"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1511019955850917035"}],"author":[{"name":{"$t":"Shawn N"},"email":{"$t":"shawnn@chromium.org"}}],"sites$pageName":{"$t":"servo"},"sites$revision":{"$t":"37"}},{"gd$etag":"\"Xyl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9201797933698934053"},"published":{"$t":"2013-08-19T22:11:21.281Z"},"updated":{"$t":"2019-08-12T07:30:45.592Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-12T07:30:41.469Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"XBuddy for Devserver"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-This-documentation-now-lives-here.\" /\u003e\u003cdiv style\u003d\"font-size:13.3333px;font-weight:400\"\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1113px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"5\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThis documentation now lives \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/refs/heads/master/xbuddy.md\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:400\"\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/h2\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1806055563569467385"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/using-the-dev-server/xbuddy-for-devserver"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9201797933698934053"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9201797933698934053"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9201797933698934053"}],"author":[{}],"sites$pageName":{"$t":"xbuddy-for-devserver"},"sites$revision":{"$t":"36"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6894570580411414193"},"published":{"$t":"2008-11-20T21:34:51.868Z"},"updated":{"$t":"2019-08-07T23:12:52.053Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-07T23:12:48.307Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Code Coverage"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Please-refer-to-src-docs-testing-code_coverage.md\" /\u003e\u003cfont face\u003d\"arial\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003ePlease refer to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/code_coverage.md\"\u003esrc/docs/testing/code_coverage.md\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/code-coverage"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6894570580411414193"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6894570580411414193"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6894570580411414193"}],"author":[{}],"sites$pageName":{"$t":"code-coverage"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"XSl7JmA7\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1806055563569467385"},"published":{"$t":"2009-12-15T01:10:34.956Z"},"updated":{"$t":"2019-08-05T15:01:04.669Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-05T15:01:01.126Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Dev server"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eMoved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/refs/heads/master/docs/devserver.md\"\u003ehttps://chromium.googlesource.com/chromiumos/chromite/+/refs/heads/master/docs/devserver.md\u003c/a\u003e. Please update the link that brought you here.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/using-the-dev-server"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1806055563569467385"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1806055563569467385"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1806055563569467385"}],"author":[{"name":{"$t":"Dan Erat"},"email":{"$t":"derat@chromium.org"}}],"sites$pageName":{"$t":"using-the-dev-server"},"sites$revision":{"$t":"74"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7647884046315932592"},"published":{"$t":"2014-11-03T04:30:59.625Z"},"updated":{"$t":"2019-08-03T00:00:36.230Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-03T00:00:33.947Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Managing Multiple Working Directories"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003egit worktree\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eIf you only want to do some quick git operations, like merging/rebasing other branches, but don't want to make your working directory dirty and cause unnecessarily rebuild, git worktree is a good solution. It only handles one single git repo though, and doesn't come with Chromium environment setup like gclient and install-build-deps.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you need to have multiple working directories that you can actually build, use gclient-new-workdir instead. Using git worktree and set up environment there would be slower and use more disk space.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003egclient-new-workdir\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you are a multitasker or want to build chromium for different targets without clobbering each other, then perhaps you'll like the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master/gclient-new-workdir.py\"\u003egclient-new-workdir.py\u003c/a\u003e script located in \u003ca href\u003d\"http://www.chromium.org/developers/how-tos/depottools\"\u003edepot_tools.\u003c/a\u003e The script works by creating a new working directory with symlinks pointing to the git database(s) found in your original chromium checkout. You can have as many working directories as you want without the overhead and hassle of cloning chromium multiple times.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003egclient-new-workdir.py /path/to/original/chromium chromium2\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eIf your file system supports copy-on-write, like btrfs, gclient-new-workdir is smart enough to use reflink to save copying time and disk space. Better yet, if the source repo is a btrfs subvolume, btrfs snapshot would be created, with all the artifacts retained. You can skip environment setup, and rebuilding should be incremental. This is the most space-efficient way to create a separate working directory. See \u003ca href\u003d\"https://crbug.com/721585\" target\u003d\"_blank\"\u003ehttps://crbug.com/721585\u003c/a\u003e for details.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Windows-devs\" /\u003eWindows devs\u003c/h3\u003e\r\n\r\n\u003cdiv\u003egclient-new-workdir.py doesn't support Windows, but you can try\u003ca href\u003d\"https://github.com/joero74/git-new-workdir\" style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\" rel\u003d\"nofollow\"\u003e https://github.com/joero74/git-new-workdir\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003e to do the same thing \u003c/span\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003e(needs to be run as admin)\u003c/b\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003e. For the curious, the script essentially uses mklink /D and other minor tricks to setup the mirrored .git repo.\u003c/span\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chromium-OS-devs\" /\u003eChromium OS devs\u003c/h3\u003e\r\n\r\n\u003cdiv\u003egclient-new-workdir.py uses symlinks that will not work inside the cros_sdk chroot. If using a \u003ca href\u003d\"https://www.chromium.org/chromium-os/developer-guide#TOC-Making-changes-to-non-cros_workon-able-packages\"\u003elocal Chromium source for Chromium OS\u003c/a\u003e, be sure to use the original working directory.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7768323185310599139"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/get-the-code/multiple-working-directories"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7647884046315932592"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7647884046315932592"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7647884046315932592"}],"author":[{"name":{"$t":"Sasha Bermeister"},"email":{"$t":"sashab@chromium.org"}}],"sites$pageName":{"$t":"multiple-working-directories"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"XSl7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8438919426918061887"},"published":{"$t":"2011-05-03T06:22:19.652Z"},"updated":{"$t":"2019-08-01T08:13:31.395Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-01T08:13:28.611Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Syncable Service API"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-EVERYTHING-BELOW-IS-OUTDATED-Go-here-instead:-https:-chromium.googlesource.com-chromium-src-HEAD-docs-sync-model_api.md\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cfont size\u003d\"5\"\u003eEVERYTHING BELOW IS OUTDATED!\u003c/font\u003e Go here instead:\u003c/font\u003e \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/docs/sync/model_api.md\" style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/docs/sync/model_api.md\u003c/a\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-http:-go-syncapi-also-see-http:-go-syncapipreso-Googlers-only-but-a-PDF-of-the-presentation-is-attached-to-this-document-\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"http://go/syncapi\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003ehttp://go/syncapi\u003c/a\u003e (also, see \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"http://go/syncapipreso\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003ehttp://go/syncapipreso\u003c/a\u003e [Googlers only, but a PDF of the presentation is attached to this document])\u003c/span\u003e\u003c/h3\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h4\u003e\u003cdiv\u003eAs sync continues to expand to handle more data types, the need for an easier and more scalable way for Chrome services to interact with sync is becoming more apparent. This document proposes a new API with the following goals:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eA Chrome service should be able to use this API to sync its data without having to know the details of the sync code base and protocol.\u003c/li\u003e\u003cli\u003eThis API should encourage new Chrome services to define its interactions with sync up front.\u003c/li\u003e\u003cli\u003eThe \"business logic\" for syncing a service's data should live in the service itself.\u003c/li\u003e\u003c/ul\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-SyncableService-Interface-and-related-classes\" /\u003eSyncableService Interface and related classes\u003c/h4\u003e\u003c/div\u003e\u003cdiv\u003eFirst, the message types that Chrome services will use to talk to sync (and vice versa):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eenum SyncType { BOOKMARKS, PREFERENCES, ... };\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eclass SyncData {\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e public:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  SyncType sync_type();\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  // The service-specific data is in a \u003ca href\u003d\"http://code.google.com/apis/protocolbuffers/docs/proto.html#extensions\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eprotobuf extension\u003c/a\u003e of \u003ca href\u003d\"https://cs.chromium.org/chromium/src/components/sync/protocol/sync.proto?l\u003d69\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eEntitySpecifics\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  // which corresponds to sync_type().\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  \u003ca href\u003d\"https://cs.chromium.org/chromium/src/components/sync/protocol/sync.proto?l\u003d69\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eEntitySpecifics\u003c/a\u003e specifics();\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eclass SyncChange {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e public:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  enum ChangeType { ADD, UPDATE, DELETE };\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  ChangeType change_type();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  // If change_type is ADD or UPDATE, this contains the new data; \u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eif\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  // change_type is DELETE, this contains the data \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eright before deletion.\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  SyncData sync_data();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSyncData CreateSyncData(SyncType sync_type, \u003ca href\u003d\"https://cs.chromium.org/chromium/src/components/sync/protocol/sync.proto?l\u003d69\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eEntitySpecifics\u003c/a\u003e specifics);\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e// |tag| should be a unique data-type specific ID that can be used to\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e// prevent duplicate entries for the same object, e.g. for extensions,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e// it would be the extension ID.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSyncChange CreateSyncChange(SyncChange::ChangeType type, SyncType sync_type, \u003ca href\u003d\"https://cs.chromium.org/chromium/src/components/sync/protocol/sync.proto?l\u003d69\"\u003eEntitySpecifics\u003c/a\u003e specifics, string tag);\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBoth \u003ccode\u003eSyncData\u003c/code\u003e and \u003ccode\u003eSyncChange\u003c/code\u003e are immutable, thread-safe, and cheaply copyable/assignable.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThen, the \u003ccode\u003eSyncChangeProcessor\u003c/code\u003e interface, which is implemented by sync classes (and also by local services\u003cspan style\u003d\"line-height:15px;font-family:arial,sans-serif;font-size:small\"\u003e—\u003c/span\u003esee below):\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"background-color:rgb(239,239,239);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(211,211,211);border-right-color:rgb(211,211,211);border-bottom-color:rgb(211,211,211);border-left-color:rgb(211,211,211);display:block;padding-top:0.5em;padding-right:0px;padding-bottom:0.5em;padding-left:1em;line-height:13px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003einterface SyncChangeProcessor {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  void ProcessSyncChanges(SyncType type, vector\u0026lt;SyncChange\u0026gt; changes);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e};\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eWhen \u003ccode\u003eProcessSyncChanges\u003c/code\u003e is called on a sync class, it processes the given list of sync changes for the given type, which eventually gets propagated to the sync server and then to other clients.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFinally, the \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eSyncableService\u003c/code\u003e interface, which Chrome services should implement:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"background-color:rgb(239,239,239);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(211,211,211);border-right-color:rgb(211,211,211);border-bottom-color:rgb(211,211,211);border-left-color:rgb(211,211,211);display:block;padding-top:0.5em;padding-right:0px;padding-bottom:0.5em;padding-left:1em;line-height:13px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003einterface SyncableService inherits SyncChangeProcessor {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  // Inherited from SyncChangeProcessor.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;color:rgb(0,0,0)\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;color:rgb(0,0,0)\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  void ProcessSyncChanges(SyncType type, vector\u0026lt;SyncChange\u0026gt; changes);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  vector\u0026lt;SyncData\u0026gt; GetAllSyncData(SyncType type);\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e  bool MergeDataAndStartSyncing(SyncType type, vector\u0026lt;SyncData\u0026gt; sync_data_to_merge, SyncChangeProcessor sync_change_processor);\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e  void StopSyncing(SyncType type);\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003einterface \u003ca href\u003d\"http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/chrome/browser/profiles/profile_keyed_service.h\u0026amp;exact_package\u003dchromium\"\u003eProfileKeyedService\u003c/a\u003e inherits SyncableService {\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  ...\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSome Chrome services map to multiple sync data types, hence the need for a \u003ccode\u003eSyncType\u003c/code\u003e parameter to all \u003ccode\u003eSyncableService\u003c/code\u003e methods (e.g., \u003ccode\u003eExtensionService\u003c/code\u003e handles both extensions and apps, and \u003ccode\u003eWebDataService\u003c/code\u003e handles both autofill and autofill profiles).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA \u003ccode\u003eSyncableService\u003c/code\u003e is also a \u003ccode\u003eSyncChangeProcessor\u003c/code\u003e.  When \u003ccode\u003eProcessSyncChanges\u003c/code\u003e is called on a Chrome service, it must process the given list of sync changes for the given type (which came from other clients via the sync server).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eGetAllSyncData\u003c/code\u003e is called, it must return a list of \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eSyncData\u003c/code\u003es which represents the currently known local data for the given type.  \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eGetAllSyncData\u003c/code\u003e may be called at any time, even before syncing starts; it should always return an accurate representation of the local state, as it may be used for diagnostics and verification, e.g. sync may call \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eGetAllSyncData\u003c/code\u003e after it calls \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eStartSync\u003c/code\u003e and verify that the local state is equivalent to the remote state.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen \u003ccode\u003eMergeDataAndStartSyncing\u003c/code\u003e is called on a Chrome service, it must do an \"initial sync\": it must merge \u003ccode\u003esync_data_to_merge\u003c/code\u003e with its local data and/or push changes to \u003ccode\u003esync_change_processor\u003c/code\u003e such that, after the function returns, the local sync state (i.e., the return value of \u003ccode\u003eGetAllSyncData\u003c/code\u003e) matches the state represented by \u003ccode\u003esync_data_to_merge\u003c/code\u003e plus any changes pushed to \u003ccode\u003esync_change_processor\u003c/code\u003e.  It should also store the given \u003ccode\u003esync_change_processor\u003c/code\u003e reference and use it to send changes for \u003ccode\u003etype\u003c/code\u003e until \u003ccode\u003eStopSyncing\u003c/code\u003e is called for \u003ccode\u003etype\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA Chrome service can assume that all \u003ccode\u003eSyncableService\u003c/code\u003e methods are called on the same thread, usually its \"native\" thread.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSyncChange\u003c/code\u003es can be assumed to be processed atomically by sync, i.e. a Chrome service will never receive a \"partial\" \u003ccode\u003eSyncChange.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSyncableService\u003c/code\u003e should be a super-interface of \u003ccode\u003e\u003ca href\u003d\"http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/chrome/browser/profiles/profile_keyed_service.h\u0026amp;exact_package\u003dchromium\"\u003eProfileKeyedService\u003c/a\u003e\u003c/code\u003e.  Most Chrome services should implement \u003ccode\u003eSyncableService\u003c/code\u003e, either directly or via \u003ccode\u003eProfileKeyedService\u003c/code\u003e.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-How-to-write-a-new-sync-aware-Chrome-service\" /\u003eHow to write a new sync-aware Chrome service\u003c/h4\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cb\u003eImportant\u003c/b\u003e\u003c/font\u003e: Loop in the sync team early!  Send an e-mail to chrome-sync-dev@google.com explaining what you want to sync.  We're happy to help.\u003c/li\u003e\u003cli\u003eYou will need to add your type to the \u003ccode\u003eSyncType\u003c/code\u003e enum as well define a protobuf to use for your data and make it an \u003ca href\u003d\"http://code.google.com/apis/protocolbuffers/docs/proto.html#extensions\"\u003eextension\u003c/a\u003e of \u003ca href\u003d\"http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/chrome/browser/sync/protocol/sync.proto\u0026amp;exact_package\u003dchromium\"\u003eEntitySpecifics\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eExcept for some special cases, you will probably need to make your service inherit from \u003ccode\u003eProfileKeyedService\u003c/code\u003e.  Make sure your service has one thread (not necessarily the UI thread) that it can use to communicate with sync.\u003c/li\u003e\u003cli\u003eWrite unit tests to:\u003c/li\u003e\u003col\u003e\u003cli\u003eMake sure \u003ccode\u003eGetAllSyncData\u003c/code\u003e accurately reflects your service's state.\u003c/li\u003e\u003cli\u003eMake sure that \u003ccode\u003eProcessSyncChanges\u003c/code\u003e handles \u003ccode\u003eSyncChanges\u003c/code\u003e intelligently (even erroneous ones).\u003c/li\u003e\u003cli\u003eMake sure that calling \u003ccode\u003eMergeDataAndStartSyncing\u003c/code\u003e on an instance of your service with another instance's sync state and a reference to that instance as a \u003ccode\u003eSyncChangeProcessor\u003c/code\u003e brings both instances to the same state.  In other words, the following should hold:\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eSyncType my_sync_type \u003d ...;\u003cbr /\u003eSyncableService my_service \u003d ...;\u003cbr /\u003eSyncableService my_other_service \u003d ...;\u003cbr /\u003emy_service.MergeDataAndStartSyncing(my_sync_type, my_other_service.GetAllSyncData(), my_other_service);\u003cbr /\u003eEXPECT_EQ(my_service.GetAllSyncData(), my_other_service.GetAllSyncData());\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eWrite sync integration tests for your service.  See \u003ca href\u003d\"http://go/syncautomation\" rel\u003d\"nofollow\"\u003ehttp://go/syncautomation\u003c/a\u003e for details.\u003c/li\u003e\u003c/ol\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Suggested-migration-for-existing-synced-Chrome-services\" /\u003eSuggested migration for existing synced Chrome services\u003c/h4\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eMake the service \"consume\" \u003ccode\u003eSyncChange\u003c/code\u003es, i.e. implement \u003ccode\u003eProcessSyncChanges\u003c/code\u003e.  This most likely involves moving some logic from the change processor to the service itself.\u003c/li\u003e\u003cli\u003eThe change processor is most likely listening to notifications from the service and using the notification's details or querying the service directly to find out what changed.  Make the service \"produce\" \u003ccode\u003eSyncChange\u003c/code\u003es: i.e., when the change processor receives a notification from the service, it should only have to query the service to get one or more \u003ccode\u003eSyncChange\u003c/code\u003es to process.  This most likely involves moving the rest of the logic from the change processor to the service itself.\u003c/li\u003e\u003cli\u003eMake the service inherit from \u003ccode\u003eSyncableService\u003c/code\u003e; this most likely involves moving the logic from the model associator to \u003ccode\u003eMergeDataAndStartSyncing\u003c/code\u003e.  The model associator itself can stick around and just call \u003ccode\u003eMergeDataAndStartSyncing\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;color:rgb(0,0,0)\"\u003e/\u003c/span\u003eStopSyncing\u003c/code\u003e from \u003ccode\u003eAssociate\u003c/code\u003e/\u003ccode\u003eDisassociateModels\u003c/code\u003e.\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Implementation-Notes\" /\u003eImplementation Notes\u003c/h4\u003e\u003cdiv\u003eSee the PDF attached for an overview of the Syncable Service API.\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSyncType\u003c/code\u003e should just be \u003ccode\u003esyncable::ModelType\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eInternally, a \u003ccode\u003eSyncData\u003c/code\u003e will contain a \u003ccode\u003eSyncEntity\u003c/code\u003e protobuf.  Or rather, a thread-safe ref-counted pointer to an immutable one, so \u003ccode\u003eSyncData\u003c/code\u003e/\u003ccode\u003eSyncChange\u003c/code\u003e can be cheaply copyable and passable across threads.  \u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003eTODO\u003c/span\u003e: We should try to make \u003ccode\u003esync_data.h\u003c/code\u003e/\u003ccode\u003esync_change.h\u003c/code\u003e not include our protobuf header files.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSome special handling is needed for bookmarks; currently, it is the only data type which uses sync's support for hierarchies.  The most practical solution for this is probably to just add bookmark-specific accessors to \u003ccode\u003eSyncChange\u003c/code\u003e for id, \u003ccode\u003efirst_child_id\u003c/code\u003e, and \u003ccode\u003esuccessor_id\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eExtensions and apps may need to use sync's support for ordering, i.e. it may also need to use \u003ccode\u003esuccessor_id\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere will most likely be one instance per thread of \u003ccode\u003eSyncChangeProcessor\u003c/code\u003e which handles all the data types which live on that thread.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAn earlier API proposal by Nicolas Zea is \u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1-Ky4lhCTIN_9cTef2zZsIh3pBALQUPj-3Hh2BpPkX20/edit?hl\u003den\"\u003ehere\u003c/a\u003e (available only to Googlers).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/Doc?docid\u003d0Aa_pnb1d4_gnZDUzOWp4bV80ZDhjeng1ZzU\u0026amp;hl\u003den\"\u003eLife of a Sync Item Update\u003c/a\u003e is useful for understanding how exactly sync works behind the scenes.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Future-plans\" /\u003eFuture plans\u003c/h4\u003e\u003cdiv\u003eSupport may be added to enable \u003ccode\u003eSyncableService\u003c/code\u003es to talk to \u003cb\u003echrome://sync-internals\u003c/b\u003e.  This will most likely involve passing some sort of Javascript bridge object in \u003ccode\u003eMergeDataAndStartSyncing\u003c/code\u003e that a \u003ccode\u003eSyncableService\u003c/code\u003e can use to raise events, and/or an additional method in \u003ccode\u003eSyncableService\u003c/code\u003e to enable it to respond to Javascript queries.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7319728324630685729"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sync/syncable-service-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8438919426918061887"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8438919426918061887"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8438919426918061887"}],"author":[{"name":{"$t":"Fred Akalin"},"email":{"$t":"akalin@chromium.org"}}],"sites$pageName":{"$t":"syncable-service-api"},"sites$revision":{"$t":"54"}},{"gd$etag":"\"Wil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4066750704612171225"},"published":{"$t":"2012-04-05T19:32:34.875Z"},"updated":{"$t":"2019-08-01T01:08:34.515Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-08-01T01:08:31.521Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"libchrome"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv /\u003e\r\n\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eDeprecation warning\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-text\"\u003e\u003cdiv class\u003d\"sites-embed-content-textbox\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"6\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/refs/heads/master/packages/libchrome.md\"\u003eThis page has been migrated\u003c/a\u003e!\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ePlease update bookmarks and referring links to point to the in-repo markdown.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7575192847733958161"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/libchrome"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4066750704612171225"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4066750704612171225"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4066750704612171225"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"libchrome"},"sites$revision":{"$t":"23"}},{"gd$etag":"\"KXsmYD1ZFw..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1322998098325065050"},"published":{"$t":"2010-03-03T19:04:56.292Z"},"updated":{"$t":"2019-07-31T21:29:47.021Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-31T21:29:44.374Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"EBuild FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cb\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/portage/ebuild_faq.md\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/portage/ebuild_faq.md\u003c/a\u003e. Please update the link that brought you here.\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/portage-build-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1322998098325065050"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1322998098325065050"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1322998098325065050"}],"author":[{}],"sites$pageName":{"$t":"portage-build-faq"},"sites$revision":{"$t":"101"}},{"gd$etag":"\"Xil7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7966445911693484"},"published":{"$t":"2014-01-14T18:31:39.612Z"},"updated":{"$t":"2019-07-31T15:59:33.392Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-31T15:59:30.877Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cros Flash"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Note:-this-page-is-deprecated.-It-has-been-ported-to-https:-chromium.googlesource.com-chromiumos-docs-master-cros_flash.md.-Please-fix-any-links-pointing-to-this-page-to-point-to-the-new-URL.\" /\u003e\u003cfont color\u003d\"#ff0000\" size\u003d\"3\" style\u003d\"font-weight:normal\"\u003eNote: this page is deprecated. It has been ported to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/cros_flash.md\" target\u003d\"_blank\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/cros_flash.md\u003c/a\u003e. Please fix any links pointing to this page to point to the new URL.\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8945126227284375934"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/build/cros-flash"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7966445911693484"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7966445911693484"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7966445911693484"}],"author":[{}],"sites$pageName":{"$t":"cros-flash"},"sites$revision":{"$t":"57"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4748994422496880417"},"published":{"$t":"2019-07-30T23:32:07.199Z"},"updated":{"$t":"2019-07-30T23:39:43.167Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-30T23:39:39.795Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"July 2019"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eJuly 2019\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eArchives: \u003c/span\u003e\u003ca href\u003d\"http://go/animations-team-highlights\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team-highlights\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:565px;height:283px\"\u003e\u003cimg height\u003d\"283\" src\u003d\"https://lh3.googleusercontent.com/w9kTMoKBL0rbJTFvKmkNWwY3xG4Z3UqhW7iLHeK9aV4YsUitV1OdoR1WEsmHnz4jiwphbWtGyO31tp_j6lxpnlmRYvfAjdVTB5vJA_vDgjqAagHNh7Zb7kATsCecD8lVfYMmiqlj\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"565\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOne of three example effects that yigu@ created to show the potential of Group Effect. I'm staggered, really.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eGroupEffect - Showing a need\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen exploring new potential features, it is important to understand what usecases they enable and how ergonomic they would be for web developers to use. This sprint, Yi (yigu@) spent some time exploring the \u003c/span\u003e\u003ca href\u003d\"https://github.com/yi-gu/group_effect\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eproposed GroupEffect\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e concept. After \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1710156\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebuilding a prototype\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, Yi created demos for three types of linked effects, such as the 'stagger' effect above. This work helps us understand the potential impact of GroupEffect, and also see how easy the proposed APIs would be to use.\u003c/span\u003e\u003c/p\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"295\" /\u003e\u003ccol width\u003d\"300\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:271px;height:184px\"\u003e\u003cimg height\u003d\"184\" src\u003d\"https://lh4.googleusercontent.com/TweoRh0njZWyEESeBZAjj8CRazxBzSQYhiB3k72KH0tPLQRJMRdXx56EpBceCuuLHgExjuK_Vp7BrtfL6j2fH1Jg8eGNVcIsmnFYM7gIBtv4pckxtNZKzvFz8GJBxqqBKlLPakrP\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"271\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Animations - towards an I2S\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003ca href\u003d\"https://drafts.csswg.org/web-animations-1\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Animations\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is a big focus for the team currently, and we continue to move towards our goal of being able to ship the full API.\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis sprint included fixes for getAnimations (majidvp@, smcgruer@), AnimationClock (flackr@), animation events (kevers@), and \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eCSS property serialization (gtsteel@) \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Roboto,sans-serif;font-size:10pt;white-space:pre-wrap\"\u003e- resulting in 50 newly passing WPT tests!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;text-align:center;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:253px;height:208px\"\u003e\u003cimg height\u003d\"208\" src\u003d\"https://lh5.googleusercontent.com/4zapRR1JUKCEExT9Dy78adDfv0BZVOEics7z7LoQfb2gCZ6JRwukYMkSyCibRxMB8fjEfSw20riiW9mJkbKHPqa_B16Uso8QdhVJnNP29M3f9c5P3i812LKoxlqyCNaAPZFSs_Au\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"253\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eViz hit testing V2 - heading to stable\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYi (yigu@) set his sights on Viz hit testing this sprint, with sensational results. He was able to close \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e12\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e hit-testing related bugs, including all known bugs blocking the 'V2' launch. As a result this new, faster hit testing model is now re-enabled for the M77 release and should be rolling out to stable sometime later this quarter.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:281px;height:113px\"\u003e\u003cimg height\u003d\"113\" src\u003d\"https://lh6.googleusercontent.com/k4oS7E04Mz46HL5n13FzLh2ev0LCQNuNvg2VYkrzLEC807Bxurf32asE05BcHMaca1lPqr9zgIYEHWWKm6V_PT8c0DRUqhzeHBVqgGaP3nmsZNq1-Lo4mFsLOHxBbGj0HiHLnA4R\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"281\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:6pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eComplex Crash Bugs\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium is a big codebase, and sometimes simple looking crash bugs can turn out to have complex causes. Thankfully these bugs are no match for Rob (flackr@) and guest star Dana (danakj@) who tackled \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/974218\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esuch a bug\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e this sprint.\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAfter multiple weeks of effort they tracked the crash to an old scheduler experiment which was unexpectedly re-ordering IPC calls! \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1692577\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDisable the experiment\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and the crash was fixed. Magic, or perhaps just \u003c/span\u003e\u003ca href\u003d\"https://en.wikipedia.org/wiki/Clarke%27s_three_laws\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esufficiently advanced debugging\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:286px;height:121px\"\u003e\u003cimg height\u003d\"121\" src\u003d\"https://lh5.googleusercontent.com/_d5BW7phRaKRlndSuxtEz8gidiwiNmYZ8NzvSpX5Iv9FplDwBinrCUcp1SgTKN1oazrAqRZYAvm3E68YfGx08KfLUEATZgD4wvIyuRd2LTGxTvOc21iS9aQIxwW-YQwC3oZmao53\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"286\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll Snap Interop\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBlink's viewport style propagation for scroll snap was incorrect based on the latest \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3740\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003espec changes\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Majid (majidvp@) dived in to fix this issue before Firefox's implementation ships, to ensure that the interop issue is addressed before usage grows and makes it more difficult to backtrack. \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSince this is a breaking change, we needed to understand its impact on the web. To do so Majid performed an \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1DxVjr3m02cPE81UrDMT_SN36bFDg5f4K3wESSwMOqck/edit#heading\u003dh.a1k7isoapl5s\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eanalysis\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e using \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1FSzJm2L2ow6pZTM_CuyHNJecXuX7Mx3XmBzL4SFHyLA/edit\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecluster telemetry\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in conjunction with \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1715906\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003euse counters\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to confirm his findings - all clear, thankfully!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:596px;height:207px\"\u003e\u003cimg height\u003d\"207\" src\u003d\"https://lh3.googleusercontent.com/K6hFM4soJErRvy01DD6mh_CQBnhGKbyWG-ymrlIptHnSNUVT1A53TNDoE2zr7YSBkIsDxFd9sjymzqQQzof2xw86kL-Z8uwXlj_KSbiWRP1xzArmob40InxUv4wFvDPsYsEeJfqZ\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"596\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThanks to this demo by gtsteel@, it is easy to see why animating in the RGB color space is preferable to sRGB.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eIt's a colorful world\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhile discussing a \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/981326\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecolor interpolation bug\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that Xida (xidachen@) was working on, he and George (gtsteel@) realized that by spec colors interpolate in the sRGB colorspace. This is unfortunate as sRGB is a non-linear space which results in less natural looking animations than the linear RGB space. George began investigating the possibility of adding RGB interpolation support to the various animation specs, however luckily we discovered that the \u003c/span\u003e\u003ca href\u003d\"https://www.w3.org/TR/css-color-4\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecss-color-4\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e spec is working on allowing web developers to \u003c/span\u003e\u003ca href\u003d\"https://www.w3.org/TR/css-color-4/#working-color-space\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echange the page's color space\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e which should also fix animations for developers who opt in.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | July 2019\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;text-align:right;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://go/animations-team\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/july-2019"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4748994422496880417"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4748994422496880417"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4748994422496880417"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"july-2019"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7097299014995540955"},"published":{"$t":"2010-05-05T23:21:12.072Z"},"updated":{"$t":"2019-07-19T22:44:04.130Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-19T22:44:01.528Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Kernel Design"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Abstract\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eAbstract\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Background_7465320890769362_00\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBackground\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Source_code_control_4731532391_7904071444645524\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSource code\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Git_repository_722971661016345\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eGit repository\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Licensing_015266548842191696_3\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eLicensing\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Classification_tags_8732926258_9482246106490493\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eChangelog entries\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upgrades\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003eUpgrades\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Modules_and_initrd_98948772996_5484075685963035\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eSupported and unsupported features\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Modules_and_initrd_30116414837_8335789022967219\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eKernel modules and initial RAM disks\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Architectures_7912381682544947\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eArchitectures\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Swap_6152778388932347_77212105\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eSwap\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Configuration-files\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eConfiguration files\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003eAbstract\u003c/h2\u003e\r\n\u003cp\u003e This document outlines the overall design of the kernel, as it relates to Chromium OS.\u003c/p\u003e\r\n\u003cp\u003eSee also the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/kernel_faq.md\"\u003eFrequently Asked Questions page\u003c/a\u003e for more day-to-day details.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Background_7465320890769362_00\" /\u003eBackground\u003c/h2\u003e\r\n\u003cp\u003e\r\nChromium OS uses the Linux Kernel. Historically we stayed on a 2.6.32 Ubuntu-based for the first several releases, but have since then moved on to track the upstream mainline kernel directly, applying our changes for the features and stability we need on top of it. \u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Source_code_control_4731532391_7904071444645524\" /\u003eSource code\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Git_repository_722971661016345\" /\u003eGit repository\u003c/h3\u003e\r\n\u003cp\u003e\r\nThe Chromium OS Linux kernel will be stored in a gerrit/git repository, hosted\r\non an externally accessible website. All platforms will build from \u003cb\u003eone\u003c/b\u003e single kernel source tree (though there will be multiple binary images).  \u003c/p\u003e\r\n\u003cp\u003eIf necessary, we will create short-term private branches for specific\r\nvendor projects that involve pre-production hardware. These branches\r\nwill be merged back into the main kernel as soon as possible, using one\r\ncode review per CL so that all code in our master branch is either from\r\nupstream or code reviewed. The intent of these private branches is to\r\nenable code review and project status monitoring of code that cannot be\r\npublicly released yet, due to NDA. The intent is specifically \u003cb\u003enot\u003c/b\u003e to use these branches to keep changes that are shipping to customers.\u003c/p\u003e\r\n\u003cp\u003eAny code submitted should be done as one Git commit per logical change, with a good description. (See \u003cfont face\u003d\"'Courier New'\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chromium-os-kernel/submitting-patches\"\u003eDocumentation/SubmittingPatches\u003c/a\u003e\u003c/font\u003e\r\nin the kernel tree.) We may create temporary public branches for the\r\npurpose of working together on code review and integration.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Licensing_015266548842191696_3\" /\u003eLicensing\u003c/h3\u003e\r\n\u003cp\u003eAll\r\nLinux kernel code, from Google and from partners, must be released\r\nunder GPLv2 and must be released under the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chromium-os-kernel/dco\"\u003eDCO (documented certificate\r\nof ownership)\u003c/a\u003e as a signoff of ownership. \r\nEach commit will contain the signoff of the code author/committer and\r\nthe ACK of the patch approver. Code should be submitted under the\r\nChromium contributor license agreement.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Classification_tags_8732926258_9482246106490493\" /\u003eChangelog entries\u003c/h3\u003e\r\n\u003cp\u003eHere's an example of a changelog entry:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCHROMIUM: bibble: a patch to fix everything\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eBug: 12345\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eThis patch fixes bug 12345 by checking for a NULL pointer before dereferencing ops-\u0026gt;thingy\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eSigned-off-by: Author \u0026lt;author@example.net\u0026gt;\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eSigned-off-by: Committer \u0026lt;committer@example.net\u0026gt;\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eAcked-by: Approver \u0026lt;approver@example.net\u0026gt;\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eAll\r\nkernel code (including backports from upstream) contributed by Google\r\nor partners will include a classification tag in the first line of the\r\ncommit log. The classification will be useful when the maintainer needs\r\nto rebase to a newer kernel; the tag is also needed for proper\r\nattribution. The tag is in ALL_CAPS_UNDERSCORE, is followed by a colon,\r\nand is at the beginning of the first line. The first line from each\r\ncommit should be a summary.\u003c/p\u003e\r\n\u003cp\u003eWhenever possible use the -x flag with git cherry-pick. This appends a line to the commit message that says which commit this cherry-pick came from. Only do this in the case that the commit was cherry-picked from a \u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003erepository\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e that is \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eeasily \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eaccessible by the public.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e Code contributed by the Chromium community will use the tag CHROMIUM. For example: \u003c/p\u003e\r\n\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCHROMIUM: bibble: a patch to fix everything\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\u003cp\u003e Code backported from upstream (Linus's tree) will use the tag UPSTREAM. For example: \u003c/p\u003e\r\n\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eUPSTREAM: bibble: a patch to fix everything\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\u003cp\u003e Code backported from an upstream maintainer tree will use two tags. For example:\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003eUPSTREAM: WIRELESS: bibble: a patch to fix everything\u003c/code\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cp\u003e Code ported from a Linux distribution tree or other non-upstream tree will also use an appropriate tag. For example:\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cp class\u003d\"sites-codesnippet-block\" style\u003d\"margin:0px\"\u003e\u003ccode\u003eUBUNTU: bibble: a patch to fix everything\u003c/code\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003e\u003ci\u003eor\u003c/i\u003e\u003c/p\u003e\r\n\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eYOCTO: bibble: a patch to fix everything\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\u003cp\u003eCode ported from a patch will use the tag FROMLIST and should include a link to the list the patch was obtained from. For example:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cp class\u003d\"sites-codesnippet-block\" style\u003d\"font-size:13.3333330154419px;font-weight:normal;margin:0px\"\u003e\u003ccode\u003eFROMLIST: bibble: a patch to fix everything\u003c/code\u003e\u003c/p\u003e\r\n\u003cp class\u003d\"sites-codesnippet-block\" style\u003d\"font-size:13.3333330154419px;font-weight:normal;margin:0px\"\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/p\u003e\r\n\u003cp class\u003d\"sites-codesnippet-block\" style\u003d\"margin:0px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;line-height:13.3333320617676px\"\u003e(am from https://patchwork.kernel.org/patch/0987654/)\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal\"\u003eCode backported that \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003eyou had to change to make it run with an older kernel version, including conflict resolutions,\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003e will use the tag BACKPORT. For example:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cpre style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eBACKPORT: bibble: a patch to fix everything\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Upgrades\" /\u003eUpgrades\u003c/h3\u003e\r\n\u003cp\u003eThe\r\nkernel will be upgraded to a new version as soon as practical after a\r\nnew version of the upstream kernel is released. We will do this via a Git\r\nrebase, this means we'll keep clean versions of our patches floated on\r\ntop of the latest tree. In practice, this will happen approximately\r\nevery 3-6 months, and approximately every other kernel versions from\r\nupstream. Other, smaller updates will be done on a continuous basis, such as merging in the -stable kernel updates.\u003c/p\u003e\r\n\u003cp\u003e All third-party vendors are expected to\r\nsupply updated versions of their code against every new mainline kernel\r\nversion (for example, at 3.2, 3.3, and so on) within 14 days of its release, if the code is not already upstream.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Modules_and_initrd_98948772996_5484075685963035\" /\u003eSupported and unsupported features\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Modules_and_initrd_30116414837_8335789022967219\" /\u003eKernel modules and initial RAM disks\u003c/h3\u003e\r\n\u003cp\u003e\r\nWe will support kernel modules, though this feature may be removed at\r\nsome point in the future. We will \u003cb\u003enot\u003c/b\u003e support modules built outside of\r\nthe main kernel tree.\u003c/p\u003e\r\n\u003cp\u003eWe will not support initial RAM disks (initrd) for the general kernel, but will need them on recovery image kernels as well as for the factory install flow.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Architectures_7912381682544947\" /\u003eArchitectures\u003c/h3\u003e\r\n\u003cp\u003eSupport for i386, ARMv7 and x86_64 is planned.\u003c/p\u003e\r\n\u003cp\u003eThe tradeoff for using 64 bits is additional power consumption and memory usage, in return for greater performance.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Swap_6152778388932347_77212105\" /\u003eSwap\u003c/h3\u003e\r\n\u003cp\u003eWe\r\ndo not plan to support swap in our initial release, but will conduct a\r\nfurther feasibility investigation to review this. We are concerned\r\nabout the effect of swap on:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eSSD write cycle lifetime\u003c/li\u003e\r\n\u003cli\u003emaximum latency\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eWe realize that not having swap will limit how many tabs a user can\r\nkeep open and the amount of anonymous memory a process can allocate.\r\nAggregate size of anonymous memory in the system will be limited to the\r\nsize of RAM. We may revisit this decision in future releases.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Configuration-files\" /\u003eConfiguration files\u003c/h2\u003e\r\n\u003cp\u003eWe use a custom split config to help keep settings unified across different architectures.  See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-configuration\"\u003eKernel Configuration document\u003c/a\u003e for more details.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chromium-os-kernel"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7097299014995540955"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7097299014995540955"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7097299014995540955"}],"author":[{}],"sites$pageName":{"$t":"chromium-os-kernel"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"Xil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5588082663501853715"},"published":{"$t":"2009-11-19T17:02:53.576Z"},"updated":{"$t":"2019-07-19T08:48:57.558Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-19T08:48:54.765Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Directory Structure (Chromium OS)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eThis page has been superseded by \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/source_layout.md\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/source_layout.md\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2820759774765985493"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide/directory-structure"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5588082663501853715"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5588082663501853715"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5588082663501853715"}],"author":[{}],"sites$pageName":{"$t":"directory-structure"},"sites$revision":{"$t":"27"}},{"gd$etag":"\"USl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2663446590929411560"},"published":{"$t":"2011-11-23T02:07:05.731Z"},"updated":{"$t":"2019-07-17T04:35:38.495Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-03T20:21:12.012Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autotest Developer FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"/\" /\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:450px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Coding-Style\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eCoding Style\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upstream-Documentation\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eUpstream Documentation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-are-useful-libraries-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWhere are useful libraries?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-test-changes-to-the-Autotest-codebase-itself-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eHow do I test changes to the Autotest codebase itself?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-I-am-writing-RPCs-what-a-is-good-reference-to-look-at-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eI am writing RPCs, what a is good reference to look at? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-test-changes-to-the-dynamic_suite-infrastructure-\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eHow do I test changes to the dynamic_suite infrastructure?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-do-I-store-large-files-that-need-to-be-publicly-accessible-for-tests-\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eWhere do I store large files that need to be publicly accessible for tests?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-s-the-fast-way-to-make-a-change-to-a-test-and-iterate-to-see-if-it-now-works-\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eWhat's the fast way to make a change to a test and iterate to see if it now works? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-s-the-fast-way-to-see-if-a-test-now-works-with-tip-of-tree-\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eWhat's the fast way to see if a test now works with tip of tree?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-Autotests\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eWriting Autotests\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-do-autotests-live-\"\u003e\u003cstrong\u003e10.1 \u003c/strong\u003eWhere do autotests live?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-word-about-imports\"\u003e\u003cstrong\u003e10.2 \u003c/strong\u003eA word about imports\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-a-simple-test-\"\u003e\u003cstrong\u003e10.3 \u003c/strong\u003eWriting a simple test \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adding-binaries-for-your-tests-to-call-as-part-of-the-test\"\u003e\u003cstrong\u003e10.4 \u003c/strong\u003eAdding binaries for your tests to call as part of the test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-tests-that-require-that-a-user-is-logged-in\"\u003e\u003cstrong\u003e10.5 \u003c/strong\u003eWriting tests that require that a user is logged in\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-do-printf-style-debugging-in-tests-\"\u003e\u003cstrong\u003e10.6 \u003c/strong\u003eHow do I do printf-style debugging in tests?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-performance-test-\"\u003e\u003cstrong\u003e10.7 \u003c/strong\u003eHow do I write a performance test?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-hardware-qualification-test-\"\u003e\u003cstrong\u003e10.8 \u003c/strong\u003eHow do I write a hardware qualification test?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-manufacturing-test-\"\u003e\u003cstrong\u003e10.9 \u003c/strong\u003eHow do I write a manufacturing test? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-interacts-with-the-UI-\"\u003e\u003cstrong\u003e10.10 \u003c/strong\u003eHow do I write a test that interacts with the UI?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-uses-Telemetry-\"\u003e\u003cstrong\u003e10.11 \u003c/strong\u003eHow do I write a test that uses Telemetry?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-bundle-a-bunch-of-tests-into-a-suite-that-can-be-scheduled-and-run-as-a-group-\"\u003e\u003cstrong\u003e10.12 \u003c/strong\u003eHow do I bundle a bunch of tests into a suite that can be scheduled and run as a group?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-requires-some-human-interaction-\"\u003e\u003cstrong\u003e10.13 \u003c/strong\u003eHow do I write a test that requires some human interaction? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-create-a-test-that-requires-running-existing-Linux-utilities-that-are-not-currently-installed-\"\u003e\u003cstrong\u003e10.14 \u003c/strong\u003eHow do I create a test that requires running existing Linux utilities that are not currently installed? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-create-a-test-that-requires-compiling-code-\"\u003e\u003cstrong\u003e10.15 \u003c/strong\u003eHow do I create a test that requires compiling code? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-do-I-get-the-error-make:-command-not-found-or-patch:-command-not-found-\"\u003e\u003cstrong\u003e10.16 \u003c/strong\u003eWhy do I get the error \"make: command not found\" or \"patch: command not found\"?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-do-I-get-the-message-Not-building-any-tests-because-the-requested-list-is-empty-when-I-use-TESTS-my_test-\"\u003e\u003cstrong\u003e10.17 \u003c/strong\u003eWhy do I get the message \"Not building any tests, because the requested list is empty\" when I use \"TESTS\u003d$my_test\"?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-use-deps\"\u003e\u003cstrong\u003e10.18 \u003c/strong\u003eHow do I use deps\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-can-I-create-my-own-dep-\"\u003e\u003cstrong\u003e10.19 \u003c/strong\u003eHow can I create my own dep?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Troubleshooting-your-dep\"\u003e\u003cstrong\u003e10.20 \u003c/strong\u003eTroubleshooting your dep\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-if-my-dep-is-built-by-another-ebuild-\"\u003e\u003cstrong\u003e10.21 \u003c/strong\u003eWhat if my dep is built by another ebuild?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-if-I-want-to-make-use-of-a-binary-tool-\"\u003e\u003cstrong\u003e10.22 \u003c/strong\u003eWhat if I want to make use of a binary tool?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-needs-access-to-large-data-files-like-media-files-\"\u003e\u003cstrong\u003e10.23 \u003c/strong\u003eHow do I write a test that needs access to large data files, like media files? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-reboots-the-device-\"\u003e\u003cstrong\u003e10.24 \u003c/strong\u003eHow do I write a test that reboots the device? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-measures-power-consumption-\"\u003e\u003cstrong\u003e10.25 \u003c/strong\u003eHow do I write a test that measures power consumption?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-language-can-I-write-my-test-in-\"\u003e\u003cstrong\u003e10.26 \u003c/strong\u003eWhat language can I write my test in?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThe intent of this document is to provide a quick look up for common features that are used in test development in Autotest. Including typical functions that are used, where to search for other potential useful functions, and how to run pylint/unittest_suite in Autotest.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBefore you proceed, you should have read through the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-user-doc\"\u003eAutotest User Documentation\u003c/a\u003e.\u003cbr /\u003e \r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Coding-Style\" /\u003eCoding Style\u003c/h2\u003e\r\n\u003cdiv\u003eAs Autotest is a mature upstream project we follow their style code when it comes to committing changes here as opposed to the Chromium OS style guide. Please refer to the coding style document that is in \u003ccode\u003eautotest/docs/coding-style.md\u003c/code\u003e or view it \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/docs/coding-style.md\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Upstream-Documentation\" /\u003eUpstream Documentation\u003c/h2\u003e\r\n\u003cdiv\u003eUpstream is hosted on github at \u003ca href\u003d\"http://autotest.github.com\" rel\u003d\"nofollow\"\u003ehttp://autotest.github.com\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eUpstream Wiki \u003ca href\u003d\"https://github.com/autotest/autotest/wiki\" rel\u003d\"nofollow\"\u003ehttps://github.com/autotest/autotest/wiki\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe github website doesn't really let you search through the docs but, you can clone the wiki repo and grep through it:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003egit clone https://github.com/autotest/autotest.wiki.git\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Where-are-useful-libraries-\" /\u003eWhere are useful libraries?\u003c/h2\u003e\r\n\u003cdiv\u003eAutotest has an import structure that exposes a lot of functionality from a number of different places. Good places to grep for code that may already do what you need is:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIn general we should try to use the same functions in tests that are written rather than creating similar functions. This helps keep the whole frame work in a maintainable state and utilizes code that has been used for a while and is known to work. \u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eclient/common_lib\u003c/li\u003e\r\n\u003cli\u003eclient/bin\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-test-changes-to-the-Autotest-codebase-itself-\" /\u003eHow do I test changes to the Autotest codebase itself?\u003c/h2\u003e\r\n\u003cdiv\u003eOften times when making changes to the Autotest codebase itself, it is difficult to test your change unless you can actually run an instance of the Autotest server locally.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo quickly get functional Autotest server setup please refer to: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/setup-autotest-server\"\u003eSetup Autotest Server\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eReasons to run a local Autotest server might include:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAutotest Scheduler work\u003c/li\u003e\r\n\u003cli\u003eAdding or changing RPCs\u003c/li\u003e\r\n\u003cli\u003eTests that involve common library changes\u003c/li\u003e\r\n\u003cli\u003eGUI/GWT Frontend work.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-I-am-writing-RPCs-what-a-is-good-reference-to-look-at-\" /\u003eI am writing RPCs, what a is good reference to look at? \u003c/h2\u003e\r\n\u003cdiv\u003eLooking at the RPC doc from the server itself can be useful.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://cautotest/afe/server/rpc_doc\" rel\u003d\"nofollow\"\u003ehttp://cautotest/afe/server/rpc_doc\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-test-changes-to-the-dynamic_suite-infrastructure-\" /\u003e\u003cbr /\u003eHow do I test changes to the dynamic_suite infrastructure?\u003c/h2\u003e\u003cdiv\u003eYou'll definitely want a locally-running Autotest server.  For most changes, you will want to start by running the unit tests in server/cros/dynamic_suite as you work.  You may also need to actually run a suite of tests against your Autotest instance.  The 'dummy' suite is ideal, and there are several ways to run it:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003esite_utils/run_suite.py\u003c/li\u003e\u003cli\u003ecli/atest create_suite_job\u003c/li\u003e\u003cli\u003eserver/autoserv test_suites/dev_harness.py\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIn the first two cases, there are a variety of command line options and arguments that allow you to set the build and platform to test, etc.  These pathways will always stage a build (if necessary), pull control files from that build, reimage devices and run the desired test suite.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003edev_harness.py does not pull control files from a particular build, but rather uses your local source tree.  If you're trying to test changes to suite control files, for example, this is probably the best way to go.  It can also be configured to skip reimaging, so you can iterate faster.  dev_harness.py is pulled in and executed directly by autoserv, so it can't take command line args.  Instead, it's configured using a file called dev_harness_conf that lives adjacent to dev_harness.py.\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Where-do-I-store-large-files-that-need-to-be-publicly-accessible-for-tests-\" /\u003eWhere do I store large files that need to be publicly accessible for tests?\u003c/h2\u003e\r\n\u003cdiv\u003eGoogle Storage is used as the general storage facility for large files. Please avoid putting large files in git as it increases everyone's check out size. A good general rule of thumb is: \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf it is a file larger than 5 megs that will be changing over time, put it in Google Storage.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA similar approach is taken as \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/localmirror\" rel\u003d\"nofollow\"\u003elocalmirror\u003c/a\u003e except we use the Google Storage bucket \u003cb\u003e\u003ci\u003egs://chromeos-test-public\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eTo upload your files please follow \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/localmirror#TOC-How-do-I-get-my-files-in-localmirro\" rel\u003d\"nofollow\"\u003e\"How to get your files my files to local mirror\"\u003c/a\u003e but using the bucket \u003cb\u003e\u003ci\u003egs://chromeos-test-public\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://sandbox.google.com/storage/?arg\u003dchromeos-test-public\"\u003ehttp://sandbox.google.com/storage/?arg\u003dchromeos-test-public\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-weight:normal\"\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-s-the-fast-way-to-make-a-change-to-a-test-and-iterate-to-see-if-it-now-works-\" /\u003eWhat's the fast way to make a change to a test and iterate to see if it now works?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h2\u003e\r\nThe fastest way to develop a test is to \u003ci\u003enot use compiled components\u003c/i\u003e in your test.  If you can write a test without cross-compiling code you can modify the test in python/shell on the target and rerun it on the target directly.  This of course also applies to the situation where you want to modify the python/shell parts of a test that has cross-compiled code.  The point is, try to use the least amount of cross-compiled code to write your test as possible.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAssuming you have done this, on the target device's console, su to root.  Then enter the /home/autotest directory on the target (provided you've run run_remote_tests once with it) and modify the test which will be in the tests subdirectory.  You can run /home/autotest:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"line-height:13px\"\u003e\u003ccode\u003eon_device# cd /home/autotest; ./bin/autotest tests/system_KernelVersion/control\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIf you have modified cross-compiled test code, you can use the above instructions but you'll be rebuilding a lot of stuff you don't need. Instead of running build_platform --withautotest, you can instead just run build_autotest.sh directly (which it calls).  This emerges the autotest cross-compiled binaries.  You can also specify precisely which test you want to rebuild to avoid having to build everything (and wait for it all to finish):\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"line-height:13px\"\u003e\u003ccode\u003einside# ./build_autotest.sh --board\u003d${BOARD} --build\u003dstorage_Fio,system_SAT\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003eThe resulting binaries will be placed in your chroot under \u003ccode\u003e${CHROOT}/build/${BOARD}/usr/local/autotest\u003c/code\u003e.   They are not installed into an image at this time.  Instead, autotest will copy them over when you run run_remote_tests.sh.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003ch2 style\u003d\"font-weight:normal\"\u003e\u003ca name\u003d\"TOC-What-s-the-fast-way-to-see-if-a-test-now-works-with-tip-of-tree-\" /\u003e\u003cb\u003eWhat's the fast way to see if a test now works with tip of tree?\u003c/b\u003e\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003eThe best way is to prepare a CL and test it using \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/build/local-trybot-documentation\"\u003etrybots\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Writing-Autotests\" /\u003eWriting Autotests\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Where-do-autotests-live-\" /\u003eWhere do autotests live?\u003c/h3\u003eMost tests are checked in under third_party/autotest/files/ (autotest.git chromium-os project). Some may be scattered around other locations. See \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/docs/user-doc.md#Q1_What-autotest-ebuilds-are-out-there\"\u003ethe autotest docs\u003c/a\u003e to find out the complete list.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eTest cases are not upstreamed to the general autotest repository as most are Chromium OS specific.  They are checked out as part of the regular sync command you used from the Chromium OS repository.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-A-word-about-imports\" /\u003e\u003cfont size\u003d\"3\"\u003eA word about imports\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eAutotest has an interesting way of imports due to it not being installed properly in PYTHONPATH. This is not an issue on Autotest trunk but Chromium OS has not yet remerged all the work there. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen dealing with Autotest internal modules you will need to import/create a \u003ci\u003ecommon.py\u003c/i\u003e file that can relatively reference the root directory of Autotest. You will find these spread throughout the code base and below is a concrete example.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you are working on code under \u003cb\u003eautotest/files/client/common_lib\u003c/b\u003e and you wanted to imported something from server you would need to\u003ci\u003e import a common.py\u003c/i\u003e that looks similar to the following:\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport os, sys\r\ndirname \u003d os.path.dirname(sys.modules[__name__].__file__)\r\nclient_dir \u003d os.path.abspath(os.path.join(dirname, \"..\"))\r\nsys.path.insert(0, client_dir)\r\nimport setup_modules\r\nsys.path.pop(0)\r\nsetup_modules.setup(base_path\u003dclient_dir,\r\n root_module_name\u003d\"autotest_lib.client\")\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e*Notice the relative path that is fed in to the client_dir variable. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce this is in the directory where you want to use the Autotest \u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport os, sys\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport common\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003efrom autotest_lib.server import frontend\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003efrontend.. etc etc\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cbr /\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cb\u003e**Note when you are writing a test the framework automatically makes autotest_lib available for you. There is no need to place a copy of common.py in your test directory.\u003c/b\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cb\u003e \u003c/b\u003e\u003c/pre\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Writing-a-simple-test-\" /\u003e\u003cfont size\u003d\"3\"\u003eWriting a simple test \u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\" style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv\u003eAutotest tests are checked into several locations under third_party/autotest.  \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere are two flavors of tests: client and server.  All tests are managed by an autotest server machine that is typically the machine where run_remote_tests is invoked.  Client tests execute entirely on the Chromium OS device.  Server tests execute on both server and client or only the server.  Client tests are usually the simplest to write and run.  Server tests are needed, for example, if a test needs to reboot the device or interact with external devices (e.g. to cut off power to the Chromium OS device).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTests are located in 4 locations in the \u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ethird_party/autotest/files/ \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003etree:\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eclient/site_tests - These are where most tests live.  These are client tests that are Chromium OS specific.\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eclient/tests - These are client tests that are general Linux tests (not Chromium OS specific).\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eserver/site_tests - These are server tests that are Chromium OS specific.\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eserver/tests - These are server tests that are general Linux tests (not Chromium OS specific).\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cfont size\u003d\"6\" style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eDecide if your test is a client or server test and choose the appropriate directory from the above.  In the sections below we refer to this directory as ${TEST_ROOT} below.\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003eNext decide which area your test falls within based on the tracker (\u003ca href\u003d\"http://code.google.com/p/chromium-os/issues/list\"\u003ehttp://code.google.com/p/chromium-os/issues/list\u003c/a\u003e).  It should be something like \"desktopui\", \"platform\", or \"network\" for instance.  This name is used to create the test name; e.g. \"network_UnplugCable\".  Create a directory for your test at $(TEST_ROOT)/$(LOWERCASE_AREA)_$(TEST_NAME).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTry to find an example test that does something similar and copy it.  You will create at least 2 files:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/control\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/${LOWERCASE_AREA}_${TEST_NAME}.py\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eYour control file runs the test and sets up default parameters.  The .py file is the actual implementation of the test.  \u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e \u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eInside the control the TEST_CLASS variable should be set to ${LOWERCASE_AREA}.  The naming convention simply exists to make it easier to find other similar tests and measure the coverage in different areas of Chromium OS.  \u003c/div\u003e \u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eYou may also want to add this test to one or more existing test suites to have it run automatically.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eAfter this, you should modify the autotest-tests-9999.ebuild under src/third_party/chromiumos-overlay/chromeos-base/autotest-tests and add your test to IUSE_TESTS or it won't be picked up by autotest when you ask it to build specific tests.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor more information on writing your test, see the \u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-user-doc\"\u003euser docs\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-binaries-for-your-tests-to-call-as-part-of-the-test\" /\u003e\u003cfont size\u003d\"3\"\u003eAdding binaries for your tests to call as part of the test\u003c/font\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cdiv\u003e\u003cdiv\u003eIn order to cross-compile, your test's compilation step should be implemented inside the \u003ccode\u003esetup()\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#000000\"\u003e method of your python code.\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e A couple of simple examples:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSources inside the autotest repo as part of the test: gl_Bench\u003c/li\u003e\u003cli\u003eSources checked in as a tarball from upstream: hardware_SAT\u003c/li\u003e\u003cli\u003eSources checked in other Chromium OS source repo: firmware_VbootCrypto, desktopui_DoLogin\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003eThe setup method of all python scripts are built as part of build_autotest.sh (which is called when you build_packages --withautotest).  This script calls all the setup functions of every python test and runs them.  These setup steps are compiled on the host for execution on the target.  The cross-compiler flags are already set so make sure if you have your own Makefile to take in the CC, CFLAGS, etc from the environment rather than hardcode them.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eNote that if you have a \u003c/i\u003e\u003ccode\u003e\u003ci\u003esetup() \u003c/i\u003e\u003c/code\u003e\u003ci\u003emethod, it should create a \u003c/i\u003e\u003ccode\u003e\u003ci\u003esrc\u003c/i\u003e\u003c/code\u003e\u003ci\u003e directory, even if empty, to avoid running the setup method on the target device.\u003c/i\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Writing-tests-that-require-that-a-user-is-logged-in\" /\u003e\u003cfont size\u003d\"3\"\u003eWriting tests that require that a user is logged in\u003c/font\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003eIf you write a test that requires a user is logged in, have your test subclass site_ui_test.UITest.  Any test that is a subclass of this class will login with the default test account as part\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003eof test initialization and logout as part of test cleanup.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-do-printf-style-debugging-in-tests-\" /\u003eHow do I do printf-style debugging in tests?\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003eUse logging.info() to generate log messages.  If you are writing a client-side test, the output unfortunately will not be shown while you are running autoserv (either directly or indirectly by using run_remote_test.sh).  If you want to print out numeric data that would be generally useful for developers to track over time, consider instead making this a performance test.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-performance-test-\" /\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003eHow do I write a performance test?\u003c/b\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/h3\u003e\r\n\u003cdiv\u003eA performance test is like any other test except it also logs one or more \u003ci\u003eperformance keyvals\u003c/i\u003e.  A performance keyval is just an identifier and a floating point number that is written to a keyvals file on the machine where run_remote_tests is invoked.  The identifier should be of the form ${UNITS}_${DESCRIPTION}.  For a simple example, refer to hardware_DiskSize and how it uses self.write_perf_keyval().\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-hardware-qualification-test-\" /\u003eHow do I write a hardware qualification test?\u003c/h3\u003e\r\n\u003cdiv\u003eHardware qualification tests are like all other tests.  The only difference is that they are referenced in one of the HWQual/config.* files.  If they require no manual setup or steps, they should be added to HWQual/config.auto.  Otherwise, a new config file should be created and instructions on the manual steps should be added to suite_HWQual/README.txt.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHardware qualification tests also usually involve a benchmark and a minimum requirement for that benchmark.  The nicest way to do this is to make your test record performance metrics with write_perf_keyval() and then add a constraints list in the HWQual control file that sets the minimum values.  See suite_HWQual/control.auto constraints parameters for examples.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-manufacturing-test-\" /\u003eHow do I write a manufacturing test?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\r\nSee how to write a hardware qualification test.  A manufacturing test should be written similarly, however there is not currently (3/3/2010) a suite for manufacturing tests.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-interacts-with-the-UI-\" /\u003eHow do I write a test that interacts with the UI?\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis varies widely depending on which UI you would like to interact with.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf you would like to temporarily shut down X:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003efrom autotest_lib.client.cros import cros_ui\u003cbr /\u003e\r\ncros_ui.stop()\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eYou can then start it back up by doing:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003efrom autotest_lib.client.cros import cros_ui\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecros_ui.start()\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf you want to control chrome, use PyAuto. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:238a01b0dd98e228\" class\u003d\"disabled\"\u003ePyAuto on ChromiumOS\u003c/a\u003e page for more details. desktopui_UrlFetch is a sample autotest test that uses pyauto to control chrome.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote: \u003c/b\u003ePyauto is getting deprecated and being replace with Telemetry. Please see below for how to run a Telemetry Test/Benchmark in autotest.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-uses-Telemetry-\" /\u003eHow do I write a test that uses Telemetry?\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-design-patterns#TOC-Wrapping-a-Telemetry-test-in-Autotest\"\u003ePlease refer to Wrapping a Telemetry test in Autotest\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-bundle-a-bunch-of-tests-into-a-suite-that-can-be-scheduled-and-run-as-a-group-\" /\u003eHow do I bundle a bunch of tests into a suite that can be scheduled and run as a group?\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSee \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-suites\"\u003eTest Suites\u003c/a\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-requires-some-human-interaction-\" /\u003eHow do I write a test that requires some human interaction?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\r\nWe call these semi-automated tests.  If you want to write a test that pops up a Chrome window, ask the test engineer some questions or to interact with some web browser functionality, and verify the result, refer to the desktopui_ChromeSemiAuto test.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-create-a-test-that-requires-running-existing-Linux-utilities-that-are-not-currently-installed-\" /\u003eHow do I create a test that requires running existing Linux utilities that are not currently installed?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf your test is a server-side test, then you need to add the package to utils/external_packages.py in autotest to get the package installed on the autotest servers.  If you have unittests that import the package also, then you need to additionally add it to virtual/\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003etarget-chromium-os-sdk so that it's in the chroot so that it will be available for your unittests on builders.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003eIf your test is a client-side test, your path changes based on if the library/utility would be useful outside the context of your test.  If yes, then add it to virtual/target-chromium-os-test to get it included on the test image.  If no \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eit's better to create a deps directory for the tool which builds it and installs it.  A simple example is hardware_SsdDetection which installs the hdparm utility.  \u003c/span\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-create-a-test-that-requires-compiling-code-\" /\u003eHow do I create a test that requires compiling code?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\r\nIn order to cross-compile, your test's compilation step should be implemented inside the \u003ccode\u003esetup()\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#000000\"\u003e method of your python code.\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e A couple of simple examples:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eSources inside the autotest repo as part of the test: gl_Bench\u003c/li\u003e\r\n\u003cli\u003eSources checked in as a tarball from upstream: system_SAT\u003c/li\u003e\r\n\u003cli\u003eSources checked in other Chromium OS source repo: firmware_VbootCrypto, system_AutoLogin\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNote that if you have a \u003ccode\u003esetup() \u003c/code\u003emethod, it should create a \u003ccode\u003esrc\u003c/code\u003e directory, even if empty, to avoid running the setup method on the target device.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHere's an example.  This is the content of platform_NullTest.py:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"font-size:12px;line-height:12px;text-align:left\" /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e#!/usr/bin/python\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# Copyright 2018 The Chromium Authors. All rights reserved.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# found in the LICENSE file.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003eimport os\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003efrom autotest_lib.client.bin import test, utils\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003eclass platform_NullTest(test.test):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    \"\"\"\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    Test autotest.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    \"\"\"\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    version \u003d 1\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    executable \u003d 'nulltest'\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    def setup(self):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        os.chdir(self.srcdir)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        utils.make(self.executable)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    def run_once(self):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        utils.system(self.srcdir + \"/\" + self.executable + \" autotesting\",\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:12px;text-align:left\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e                     timeout\u003d60)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAfter creating this file (and \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003econtrol\u003c/span\u003e, \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003esrc/Makefile\u003c/span\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e, \u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eand\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e src/nulltest.c\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e), add a line to the autotest-tests ebuild (\u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003echromiumos-overlay/chromeos-base/autotest-tests/autotest-tests-9999.ebuild\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e).  Make sure that autotest-tests is in your cros_workon list, then run \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eTESTS\u003dplatform_NullTest emerge-\u0026lt;board\u0026gt; autotest-tests\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  This should compile your C program.  After this, you may run \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\"\u003erun_remote_tests --use_emerged\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  Don't use gmerge for autotest or autotest-tests.\u003c/font\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Why-do-I-get-the-error-make:-command-not-found-or-patch:-command-not-found-\" /\u003eWhy do I get the error \"make: command not found\" or \"patch: command not found\"?\u003c/h3\u003e\u003cdiv\u003eThese messages come up when autotest tries to run 'make' or 'patch' on the client.  They are not supposed to run there.  Test code is only patched and compiled on the host as describe \u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq#TOC-How-do-I-create-a-test-that-requires-compiling-code-\"\u003eabove\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003eCommon mistakes are:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003efailed to first build with 'TESTS\u003dnewtest emerge-\u0026lt;board\u0026gt; autotest-tests'.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003efailed to run the run_remote_tests.sh script with --use_emerged.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Why-do-I-get-the-message-Not-building-any-tests-because-the-requested-list-is-empty-when-I-use-TESTS-my_test-\" /\u003eWhy do I get the message \"Not building any tests, because the requested list is empty\" when I use \"TESTS\u003d$my_test\"?\u003c/h3\u003e\u003cdiv\u003eRecently (relative to the creation of most of these notes) autotests-tests was split into several other packages in chromiumos-overlay/chromeos-base/autotest-*.  If $my_test was moved out of autotest-tests into autotest-chrome, for example, you have to cros_workon and emerge autotest-chrome:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003ecros_workon start --board \u0026lt;board\u0026gt; autotest-chrome\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eTESTS\u003d$my_test emerge-\u0026lt;board\u0026gt; autotest-chrome\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003eIn general, you can grep for \"tests_${my_tests}\" in chromiumos-overlay/chromeos-base/autotest-*/*9999.ebuild to find the package with your test.\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-use-deps\" /\u003eHow do I use deps\u003c/h3\u003e\r\nThe deps feature is used to install packages that are required by tests. Sometimes these packages must be compiled from source and installed on the test machine. Rather than include this installation procedure in the test itself, we can create a 'dep' which does this for us. Then the test can specify that it needs this dep to work. Autotest will make sure that the dependency is built and copied to the target.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFirst take a look at an example: hardware_SsdDetection. You will notice that it does this in the setup method:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eself.job.setup_dep(['hdparm'])\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis ends up running the python file \u003ccode\u003eclient/deps/hdparm.py\u003c/code\u003e. This will look after building the hdparm utility and making sure it is available for copying to the target. The mechanics of this are explained in the next topic, but imagine using \u003ccode\u003e./configure\u003c/code\u003e and installing with the \u003ccode\u003eclient/deps/hdparm\u003c/code\u003e directory as the install root.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWithin the run_once() method in the test you will see this:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e        dep \u003d 'hdparm'\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        dep_dir \u003d os.path.join(self.autodir, 'deps', dep)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        self.job.install_pkg(dep, 'dep', dep_dir)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis is the code which actually installs the hdparm utility on the target. It will be made available in the \u003ccode\u003e/usr/local/autotest/deps/hdparm\u003c/code\u003e directory in this case. When it comes time to run it, you will see this code:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e        path \u003d self.autodir + '/deps/hdparm/sbin/'\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        hdparm \u003d utils.run(path + 'hdparm -I %s' % device)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis is pretty simple - since the hdparm binary was installed to \u003ccode\u003eclient/deps/hdparm/sbin/hdparm\u003c/code\u003e we can run it there on the target.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-can-I-create-my-own-dep-\" /\u003eHow can I create my own dep?\u003c/h3\u003e\r\nIf you have your own tool and want to create a dep for it so that various tests can use it, this section is for you.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFirst create a subdirectory within deps. Let's call your dep 'harry'. So you will create \u003ccode\u003eclient/deps/harry\u003c/code\u003e and put \u003ccode\u003eharry.py\u003c/code\u003e inside there.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIn harry.py you will want something like the following:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport os\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003efrom autotest_lib.client.bin import utils\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eversion \u003d 1\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003edef setup(tarball, topdir):\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    srcdir \u003d os.path.join(topdir, 'src')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.extract_tarball_to_dir(tarball, srcdir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    os.chdir(srcdir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.system('patch -p1 \u0026lt; ../fix-wibble.patch')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.configure()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.make()\u003cbr /\u003e\r\n\u003c/code\u003e\u003ccode\u003e    utils.make('install')\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e# We got the src from http://harry.net/harry-0.24.tar.bz2\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003epwd \u003d os.getcwd()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003etarball \u003d os.path.join(pwd, 'harry-0.24.tar.bz2')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eutils.update_version(pwd + '/src', False, version, setup, tarball, pwd)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThe URL mentioned in the file should be the location where you found your tarball. Download this and put it in the deps directory as well. You will be checking this into the repository as a binary file.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe \u003ccode\u003eutils.update_version()\u003c/code\u003e call ensures that the correct version of harry is installed. It will call your setup() method to build and install it. If you specify False for the preserve_srcdir parameter then it will always erase the src directory, and call your setup() method. But if you specify True for preserve_srcdir, then update_version() will check the installed version of the src directory, and if it hasn't changed it will not bother installing it again.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nYou will also see that pwd is set to the current directory. This is \u003ccode\u003eclient/deps/harry\u003c/code\u003e in this case because autotest changes this directory before importing your python module. We unpack into a src subdirectory within that to keep things clean.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhen your setup() method is called it should unpack the tarball, configure and build the source, then install the resulting binaries under the same \u003ccode\u003eclient/deps/harry\u003c/code\u003e directory. You can see the steps in the example above - it mirrors a standard GNU UNIX build process. If you need to pass parameters to configure or make you can do that also. Any parameters after 'setup' in the update_version() call are passed to your setup method. \u003cbr /\u003e\r\n\u003cbr /\u003e\r\nAfter calling utils.update_version() from within harry.py we will have binaries installed (say in \u003ccode\u003eclient/deps/harry/sbin/harry\u003c/code\u003e) as well as the src directory still there (\u003ccode\u003eclient/deps/harry/src\u003c/code\u003e).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFinally for reasons that we won't go into you should create the file common.py in your directory, like this:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport os, sys\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003edirname \u003d os.path.dirname(sys.modules[__name__].__file__)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eclient_dir \u003d os.path.abspath(os.path.join(dirname, \"../../\"))\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esys.path.insert(0, client_dir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eimport setup_modules\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esys.path.pop(0)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esetup_modules.setup(base_path\u003dclient_dir,\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e                    root_module_name\u003d\"autotest_lib.client\")\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eand you need a file called 'control' too:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003ejob.setup_dep(['fio'])\u003c/code\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Troubleshooting-your-dep\" /\u003eTroubleshooting your dep\u003c/h3\u003e\r\nIf you have created a new dep but run_remote_tests.sh doesn't work and you get an error like:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ePackageInstallError: Installation of harry(type:dep) failed : dep-harry.tar.bz2 could not be fetched from any of the repos ['autoserv://']\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nthen this section is for you. It explains a little more of the detail of how the dependencies are transfered from server (your workstation) to the client (target).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhen you call  self.job.install_pkg(dep, 'dep', self.dep_dir), it causes the autotest client to install the dependency. In this case the client will end up using the autoserv fetcher. Within client/bin/harness_autoserve.py you will see the class AutoservFetcher. It has a method fetch_pkg_file() which calls harness_autoserv.fetch_package() to fetch the package. This issues a AUTOTEST_FETCH_PACKAGE command over the logging connection to autoserv, requesting the package. Yes the logging connection is re-used to support a kind of ftp server for the client!\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe server end of autoserv sits in server/autotest.py. Each line of log output coming from the client is examined in client_logger._process_line(). When it sees a line starting with AUTOTEST_FETCH_PACKAGE it calls _send_tarball() which tries to find a matching directory to package up and send. The pkg_name is in a standard format: \u003ccode\u003epkgtype-name.tar.bz2\u003c/code\u003e and in this case pkgtype is 'dep'. It will package up the client/deps/\u0026lt;name\u0026gt; directory into a tarball and send it to the client. When this is working you will see something like this message when you run the test:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e12:08:06 INFO | Bundling /home/sjg/trunk/src/third_party/autotest/files/client/deps/harry into dep-harry.tar.bz2\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nWhen it is not working, make sure the directory exists on the server side in the right place.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-if-my-dep-is-built-by-another-ebuild-\" /\u003eWhat if my dep is built by another ebuild?\u003c/h3\u003e\r\nThe above method is fine for external packages, but it is not uncommon to want to use a byproduct of another ebuild within a test. A good example of this is the Chromium functional tests, which require PyAuto, a test automation framework built by Chromium. In the \u003ccode\u003esrc/third_party/chromiumos-overlay/chromeos-base/\u003c/code\u003e\u003ccode\u003echromeos-chrome\u003c/code\u003e ebuild you will see:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e    if use build_tests; then\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        install_chrome_test_resources \"${WORKDIR}/test_src\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # NOTE: Since chrome is built inside distfiles, we have to get\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # rid of the previous instance first.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        rm -rf \"${WORKDIR}/${P}/${AUTOTEST_DEPS}/chrome_test/test_src\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        mv \"${WORKDIR}/test_src\" \"${WORKDIR}/${P}/${AUTOTEST_DEPS}/chrome_test/\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e        # HACK: It would make more sense to call autotest_src_prepare in\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # src_prepare, but we need to call install_chrome_test_resources first.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        autotest_src_prepare\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nYou can see that this is creating a deps directory within the build root of chrome, called chrome_test. From the previous section we know that a chrome_test.py file must be installed in this deps directory for this to work. This actually comes from the chromium tree (\u003ccode\u003echrome/src/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py\u003c/code\u003e since you asked). This file is very simple:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport common, commands, logging, os\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003efrom autotest_lib.client.bin import utils\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eversion \u003d 1\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003edef setup(top_dir):\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    return\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003epwd \u003d os.getcwd()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eutils.update_version(pwd + '/src', False, version, setup, None)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nIn this case the directory already contains pre-built binaries, since they were built and copied in by the ebuild above. The setup() method will always be called, but has nothing to do.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-if-I-want-to-make-use-of-a-binary-tool-\" /\u003eWhat if I want to make use of a binary tool?\u003c/h3\u003e\r\nSee the instructions for including and building the source above, or use the ebuild method if needed. You cannot simply include a pre-built binary (e.g. by checking it into the repository) since this will not work on any platform. All software must be built by the official toolchain for that platform and the only reasonable way to be sure of that is to include the source and build it.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-needs-access-to-large-data-files-like-media-files-\" /\u003eHow do I write a test that needs access to large data files, like media files?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\r\nIf the data files are posted somewhere else, they may fetched by the test when it starts.  If you add the fetching to the setup() method, this will cause the fetch to occur during build_autotest and cause the fetched results to be put in every packaged build of autotest.  This can cause a large package and might also imply that the media/data may be repackaged.  The same issues apply if you commit the large data files.  Instead it's preferable to fetch the data from the client machine.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eBeware of licensing restrictions on sample data used by a test.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-reboots-the-device-\" /\u003eHow do I write a test that reboots the device? \u003c/h3\u003e\r\nSee server/site_tests/platform_BootPerfServer, which reboots the device and runs the client test platform_BootPerf which logs performance data about boot time.  Note that your test must be a server test.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-measures-power-consumption-\" /\u003eHow do I write a test that measures power consumption?\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSee power_IdleServer.  This test cuts power and logs performance data in the form of battery life remaining information.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-language-can-I-write-my-test-in-\" /\u003eWhat language can I write my test in?\u003c/h3\u003e\r\n\u003cdiv\u003eThe most straightforward language to use is Python.  Every autotest needs at least some Python code in the control file, and recording performance results, printf-style debugging, and passing up informative error messages all require Python code.  You can also write C/C++ cross-compiled code.  You can even write shell scripts, but do note that you will cause yourself extra pain either when developing your test and/or when diagnosing problems if you choose a language other than Python.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eWhat if my test requires a build artifact?\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1rcfuMIPaaCOUp_41ahNdVM9K88iMYtCSdbiKCHn346U/edit?usp\u003dsharing\"\u003eInternal-only documentation for build artifact downloading\u003c/a\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2663446590929411560"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2663446590929411560"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2663446590929411560"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"autotest-developer-faq"},"sites$revision":{"$t":"48"}},{"gd$etag":"\"UCl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8078852216907067147"},"published":{"$t":"2009-11-19T17:04:01.216Z"},"updated":{"$t":"2019-07-17T00:30:11.971Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-10-15T19:57:48.448Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"High-Level Developer FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:300px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Should-I-call-my-build-Chromium-OS-or-Google-Chrome-OS-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eShould I call my build Chromium OS or Google Chrome OS?\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Will-the-autoupdate-feature-work-on-both-Google-Chrome-OS-and-Chromium-OS-\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eWill the autoupdate feature work on both Google Chrome OS and Chromium OS?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Will-the-verified-boot-feature-work-on-both-Google-Chrome-OS-and-Chromium-OS-\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eWill the verified boot feature work on both Google Chrome OS and Chromium OS?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-are-the-minimum-hardware-requirements-1\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eWhat are the minimum hardware requirements?\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-about-other-hardware:-Does-Chromium-OS-support-my-wifi-card-\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eWhat about other hardware: Does Chromium OS support my wifi card?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Is-it-true-that-you-don-t-support-hard-disk-drives-HDDs-\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eIs it true that you don't support hard disk drives (HDDs)?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-OS-issues\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eChromium OS issues\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-I-can-t-log-in\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eI can't log in\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-is-timezone-managed-\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eHow is timezone managed?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Miscellaneous\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eMiscellaneous\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-are-the-shortcut-keys-\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eWhat are the shortcut keys?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Are-native-applications-supported-\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eAre native applications supported?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eThis FAQ is for\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e developers; check out the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromium-os-faq\"\u003eGeneral Chromium OS FAQ\u003c/a\u003e for non-development related questions.  If that doesn't work out, try the \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:6b4e9f4ef0ee50d0\" class\u003d\"disabled\"\u003ediscussion groups\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003cbr /\u003e\u003chr /\u003e\r\n\r\n\u003cfont color\u003d\"#000000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Should-I-call-my-build-Chromium-OS-or-Google-Chrome-OS-\" /\u003eShould I call my build Chromium OS or Google Chrome OS?\u003c/h2\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eYou should call it Chromium OS.\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Will-the-autoupdate-feature-work-on-both-Google-Chrome-OS-and-Chromium-OS-\" /\u003eWill the autoupdate feature work on both Google Chrome OS and Chromium OS?\u003c/h3\u003e\r\n\u003cdiv\u003eWe don't plan to support autoupdate on Chromium OS, as we did not build the binaries, and we don't know what modifications you've made to the system, so we don't want to blow away any changes you may have made to the code. Therefore Google will not autoupdate Chromium OS systems, but you're welcome to set up your own autoupdate server.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eGoogle Chrome OS will autoupdate to keep consumer machines running the latest and greatest at all times.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Will-the-verified-boot-feature-work-on-both-Google-Chrome-OS-and-Chromium-OS-\" /\u003eWill the verified boot feature work on both Google Chrome OS and Chromium OS?\u003c/h3\u003e\r\n\u003cdiv\u003eThe verified boot procedure relies on custom firmware and hardware modifications and hence will work only for Google Chrome OS.\u003c/div\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-What-are-the-minimum-hardware-requirements-\" /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-size:13px\"\u003e\u003cfont\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:13px\"\u003e\u003chr /\u003e\u003c/font\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-are-the-minimum-hardware-requirements-1\" /\u003eWhat are the minimum hardware requirements?\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe open-source nature of Chromium OS allows it to be ported to an expanding range of hardware; however, some base requirements are likely to remain fixed.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHardware-accelerated OpenGL or OpenGL ES support is mandatory, and the Chromium browser's memory footprint is an obvious lower bound for RAM.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSee the \u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDeveloper Hardware list\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e for examples of netbooks on which developers are successfully running Chromium OS.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-about-other-hardware:-Does-Chromium-OS-support-my-wifi-card-\" /\u003eWhat about other hardware: Does Chromium OS support my wifi card?\u003c/h3\u003e\r\n\u003cp\u003eIn order to ensure the best user experience with Google Chrome OS, we're going through a careful hardware selection and testing process for hardware components.\u003c/p\u003e\r\n\u003cp\u003eFor Chromium OS, the open source community and Google are working to add support for a very broad range of hardware. If the device you're interested in has an open source driver already in the upstream Linux kernel, please send a request to \u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-os-dev/topics\" target\u003d\"_blank\"\u003echromium-os-dev\u003c/a\u003e -- if you can include a proposed patch, even better.\u003c/p\u003e\r\n\u003cp\u003ePlease see our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list\"\u003esupported developer hardware wiki\u003c/a\u003e for more details.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Is-it-true-that-you-don-t-support-hard-disk-drives-HDDs-\" /\u003eIs it true that you don't support hard disk drives (HDDs)?\u003c/h3\u003e\r\n\u003cp\u003eFirstly, we should point out that the information in the open source release has been misinterpreted as saying that we don't support local storage. Most Google Chrome OS devices use SSDs although we have a few that also use HDDs. The reasons to prefer SSD is performance and reliability.\u003c/p\u003e\r\n\u003cp\u003eChromium OS will indeed work with conventional HDDs, though the disk accesses are optimized for flash-based storage, like reduced read-ahead.\u003c/p\u003e\u003chr /\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Chromium-OS-issues\" /\u003eChromium OS issues\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-I-can-t-log-in\" /\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eI can't log in\u003c/span\u003e\u003c/h3\u003e\r\n\u003c/font\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca name\u003d\"TOC-I-can-t-login\" /\u003e\u003c/font\u003e\u003c/h2\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eLogin may fail under various circumstances. For example, if you do not have network connectivity and you have never logged in before, then you will not be able to log in.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe login screen should display a message beneath the username/password input field. For example, if you have network connectivity and provide the wrong credentials, you will be told that either your username or password is incorrect.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTo troubleshoot networking at this point, you have to jump to a virtual terminal (only enabled on dev machines) by using Ctrl+Alt+F2 (you might need to use the \u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:4dd6577ae632b73b#TOC-Set-the-shared-user-password\" class\u003d\"disabled\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eshared user password\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e that to login if you set it).\u003c/font\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you are able to log in to the virtual terminal, reconfigure the networking service (\u003c/font\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003ccode\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003esudo restart shill\u003c/font\u003e\u003c/code\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e).  \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNote:\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e If you are having trouble with wireless, just plug in an Ethernet cable. It is much easier to troubleshoot a networking issue once you have logged in.\u003c/font\u003e\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-is-timezone-managed-\" /\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eHow is timezone managed?\u003c/span\u003e\u003c/h3\u003e\u003ch2 style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-style:normal;font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)\"\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca name\u003d\"TOC-I-can-t-login\" style\u003d\"color:rgb(0,102,204);outline:none\" /\u003e\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:13.3333330154419px\"\u003eOn Chromium OS, local timezone is managed by the Chromium browser. The default timezone is Pacific Time (PST). To change it, please refer to \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://support.google.com/chromebook/answer/177871?hl\u003den\"\u003ehttps://support.google.com/chromebook/answer/177871?hl\u003den\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003eIn the case of a Chrome-less build, the timezone is left unset and defaulted to UTC. To set to a different timezone, the symlink \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e/var/lib/timezone/localtime\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003e should be linked to a specific zone file, such as \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e/usr/share/zoneinfo/UTC\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003chr /\u003e\r\n\r\n\r\n\r\n\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial;line-height:13px\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Miscellaneous\" /\u003eMiscellaneous\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-are-the-shortcut-keys-\" /\u003eWhat are the shortcut keys?\u003c/h3\u003e\r\n\u003cp\u003e\u003cfont\u003e\u003cfont\u003eTo get a visual overlay, \u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003ehit Ctrl-Alt-/\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e and then hold modifier keys like Ctrl, Alt, and Shift to see the associated hotkeys.\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp\u003eMost browser shortcuts also apply: \u003ca href\u003d\"http://www.google.com/support/chrome/bin/answer.py?hl\u003den\u0026amp;answer\u003d95743\"\u003ehttp://www.google.com/support/chrome/bin/answer.py?hl\u003den\u0026amp;answer\u003d95743\u003c/a\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"line-height:normal\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Are-native-applications-supported-\" /\u003eAre native applications supported?\u003c/h3\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003cp\u003eGoogle Chrome OS is a web-centric system, so all applications are web applications; this provides powerful and simple manageability and security. To write applications that will benefit from native code execution we recommend using NativeClient, an open source project that allows web apps to run native code securely within a browser. See \u003ca href\u003d\"http://code.google.com/chrome/nativeclient/\"\u003ehttp://code.google.com/chrome/nativeclient/\u003c/a\u003e for more details.\u003c/p\u003e\r\n\u003cp\u003eOf course Chromium OS is open source, and it's Linux.  This means that as a developer you can do pretty much anything you want, including installing any Linux application.\u003c/p\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/developer-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8078852216907067147"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8078852216907067147"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8078852216907067147"}],"author":[{}],"sites$pageName":{"$t":"developer-faq"},"sites$revision":{"$t":"49"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6717090119063056243"},"published":{"$t":"2010-11-11T23:25:43.337Z"},"updated":{"$t":"2019-07-17T00:14:07.533Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-23T05:05:16.121Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium OS FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-s-the-difference-between-Chromium-OS-and-Google-Chrome-OS-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eWhat's the difference between Chromium OS and Google Chrome OS?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-can-I-download-Google-Chrome-OS-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eWhere can I download Google Chrome OS?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-can-I-download-Chromium-OS-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWhere can I download Chromium OS?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-I-am-a-hardware-manufacturer-who-can-I-talk-to-about-making-a-Chrome-OS-product-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eI am a hardware manufacturer, who can I talk to about making a Chrome OS product?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-s-the-difference-between-Chromium-OS-and-Google-Chrome-OS-\" /\u003eWhat's the difference between Chromium OS and Google Chrome OS?\u003c/h2\u003e\r\n\u003cp\u003eGoogle Chrome OS is to Chromium OS what Google Chrome browser is to Chromium.\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eChromium OS\u003c/b\u003e is the open source project, used primarily by developers, with code that is available for anyone to checkout, modify, and build.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eGoogle Chrome OS\u003c/b\u003e is the Google product that OEMs ship on Chromebooks for general consumer use.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eSome specific differences:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eThe two projects fundamentally share the same code base, but Google Chrome OS has some additional firmware features, including verified boot and easy recovery, which require corresponding hardware changes and thus also don't work out of the box in Chromium OS builds.\u003c/li\u003e\r\n\u003cli\u003eGoogle Chrome OS runs on specially optimized hardware in order to get enhanced performance and security.\u003c/li\u003e\r\n\u003cli\u003eChromium OS does not auto-update by default (so that changes you may have made to the code are not blown away), whereas Google Chrome OS seamlessly auto-updates so that users have the latest and greatest features and fixes.\u003c/li\u003e\r\n\u003cli\u003eGoogle Chrome OS is supported by Google and its partners; Chromium OS is supported by the open source community.\u003c/li\u003e\r\n\u003cli\u003eGoogle Chrome OS includes some binary packages which are not allowed to be included in the Chromium OS project. A non-exhaustive list:\u003c/li\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eAdobe Flash\u003c/li\u003e\r\n\u003cli\u003eWidevine CDM plugin (to support \u003ca href\u003d\"https://w3c.github.io/encrypted-media/\" rel\u003d\"nofollow\"\u003eHTML5 EME\u003c/a\u003e)\u003c/li\u003e\r\n\u003cli\u003e3G Cellular support (but work is on going to address this)\u003c/li\u003e\u003cli\u003eDisplayLink Manager for video over USB (some systems)\u003c/li\u003e\u003cli\u003eAndroid (ARC++) container for running Android apps\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eSome components are available in both, but as closed source binary-only blobs.  A non-exhaustive list:\u003c/li\u003e\u003cul\u003e\u003cli\u003eGraphics Libraries (e.g. OpenGL) on ARM platforms\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cli\u003eGoogle Chrome ships with its own set of \u003ca href\u003d\"http://www.chromium.org/developers/how-tos/api-keys\"\u003eAPI keys\u003c/a\u003e while Chromium does not include any\u003c/li\u003e\u003cul\u003e\u003cli\u003eUsers are expected to set up their own\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eGoogle Chrome OS has a \u003ca href\u003d\"https://www.google.com/intl/en/images/logos/chrome_logo.gif\" target\u003d\"_blank\"\u003egreen/yellow/red logo\u003c/a\u003e while Chromium OS has a \u003ca href\u003d\"http://dev.chromium.org/_/rsrc/1302286216006/config/customLogo.gif\" target\u003d\"_blank\"\u003eblue/bluer/bluest\u003c/a\u003e logo.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Where-can-I-download-Google-Chrome-OS-\" /\u003eWhere can I download Google Chrome OS?\u003c/h2\u003e\r\n\u003cp\u003eGoogle Chrome OS is not a conventional operating system that you \r\ncan download or buy on a disc and install. As a consumer, the way you \r\nwill get Google Chrome OS is by buying a Chromebook that has Google Chrome \r\nOS installed by the OEM. Google Chrome OS is being developed to run on \r\nnew machines that are specially optimized for increased security and \r\nperformance. We are working with manufacturers to develop reference \r\nhardware for Google Chrome OS.\u003c/p\u003e\r\n\u003cp\u003eChromebooks are available for sale now! Check out the \u003ca href\u003d\"http://www.google.com/chromebook/\" target\u003d\"_blank\"\u003eGoogle Chromebook site\u003c/a\u003e for more information.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Where-can-I-download-Chromium-OS-\" /\u003eWhere can I download Chromium OS?\u003c/h2\u003e\r\n\u003cp\u003eIf you are the kind of developer who likes to build an open source operating system from scratch, you can follow the developer instructions to check out Chromium OS, build it and experiment with it. A number of sites have also posted pre-built binaries of Chromium OS. However, these downloads are not verified by Google, therefore please ensure you trust the site you are downloading these from.\u003c/p\u003e\r\n\u003cp\u003eKeep in mind that Chromium OS is not for general consumer use.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-I-am-a-hardware-manufacturer-who-can-I-talk-to-about-making-a-Chrome-OS-product-\" /\u003eI am a hardware manufacturer, who can I talk to about making a Chrome OS product?\u003c/h2\u003e\r\n\u003cp\u003eThe Chrome OS business development team can be reached at \u003ca href\u003d\"mailto:chromeos-interested@google.com\" target\u003d\"_blank\"\u003echromeos-interested@google.com\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromium-os-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6717090119063056243"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6717090119063056243"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6717090119063056243"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$pageName":{"$t":"chromium-os-faq"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3505484253471415459"},"published":{"$t":"2010-06-29T16:49:03.964Z"},"updated":{"$t":"2019-07-16T08:15:08.998Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-16T08:15:07.092Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mac Quick Start"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis page describes how to get started with managing Google Chrome on a Mac network using Apple’s Profile Manager. These instructions are only an example to help you get started. You can use any system management software you choose, but specific steps may vary.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eNote\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: These steps focus only on pushing out a plist configuration file for the Chrome Browser. Your Mac network must be set up and in a managed state. This guide does not cover how to setup macOS Server or Profile Manager to manage your Mac devices.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv\u003e\u003col\u003e\u003cli style\u003d\"font-family:Arial\"\u003eLog into Profile Manager on the server machine from a web browser\u003c/li\u003e\u003cli style\u003d\"font-family:Arial\"\u003eNavigate to \u003cb\u003eDevices\u003c/b\u003e \u0026gt; \u003cb\u003eSettings\u003c/b\u003e, choose the device group for which to define Chrome policies.  \u003c/li\u003e\u003cli style\u003d\"font-family:Arial\"\u003eClick \u003cb\u003eEdit\u003c/b\u003e.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003eGo to \u003c/font\u003e\u003cb style\u003d\"font-family:Arial\"\u003eCustom Settings\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e and add a Preference Domain with domain '\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ci\u003ecom.google.Chrome'\u003c/i\u003e\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:Arial\"\u003eUpload a pre-configured plist file or manually add items by key and value. A full list and description of policies can be found at \u003ca href\u003d\"https://www.chromium.org/administrators/policy-list-3\"\u003ehttps://www.chromium.org/administrators/policy-list-3\u003c/a\u003e.\u003c/li\u003e\u003cli style\u003d\"font-family:Arial\"\u003eClick \u003cb\u003eOk\u003c/b\u003e and payload will be created and synced to the selected devices. \u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDebugging\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have trouble, it usually pays off to examine whether the settings are correctly stored and read by Chrome. First of all, navigate to about:policy in Chrome. It lists any policy settings that Chrome has picked up. If your settings show up, good. If not, you can dig deeper and check whether macOS actually put them into place correctly. Mandatory policy is stored in /Library/Managed Preferences/\u0026lt;username\u0026gt;/com.google.Chrome.plist while recommended policy is stored in \u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e/Library/Preferences/com.google.Chrome.plist\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e. The plutil command can be used from a terminal to convert it to XML format:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e# sudo -s\u003c/li\u003e\u003cli\u003e# cd /Library/Managed Preferences/\u0026lt;username\u0026gt;\u003c/li\u003e\u003cli\u003e# plutil -convert xml1 com.google.Chrome.plist\u003c/li\u003e\u003cli\u003e# cat com.google.Chrome.plist\u003c/li\u003e\u003c/ul\u003eFor debugging, this file is in a place where it can be edited manually. Chrome will pick up the updated preferences automatically. Note that this is not recommended for making persistent changes to policy, since macOS will rewrite the file with settings configured through Workgroup Manager.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChrome on macOS does not show unknown policies on the chrome://policy page. If you don't find a policy you have set there check if the name is spelled correctly and if the policy is actually supported on the macOS platform.  \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNotes for Chromium\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eChromium can be managed in a similar way, with a few differences:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eThe Chromium application must be managed, instead of Google Chrome\u003c/li\u003e\u003cli\u003eChromium is identified as \"org.chromium.Chromium\"\u003c/li\u003e\u003cli\u003eThe plist file is in the same place but is named \"org.chromium.Chromium.plist\"\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eUnknown issues\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003ePlease file a bug report at \u003ca href\u003d\"http://new.crbug.com\"\u003ehttp://new.crbug.com\u003c/a\u003e and select the \"Enterprise Issue\" template.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/mac-quick-start"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3505484253471415459"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3505484253471415459"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3505484253471415459"}],"author":[{}],"sites$pageName":{"$t":"mac-quick-start"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1848963528989568506"},"published":{"$t":"2016-04-01T17:55:37.458Z"},"updated":{"$t":"2019-07-15T21:53:44.103Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-15T21:53:41.187Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Markdown Documentation guide"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eNew documentation related to code structure should be put in Markdown. The best practices recommendation is to put a README.md file in the code directory closest to your component or code.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo preview changes to Markdown files, see \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/README.md\"\u003e//src/docs/README.md\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePlease write your Markdown in accordance with Google's \u003ca href\u003d\"https://github.com/google/styleguide/tree/gh-pages/docguide\" rel\u003d\"nofollow\"\u003estyle guide\u003c/a\u003e, and \u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/chromium-dev/KECdEn562vY/sqRor1frEgAJ\"\u003eattempt to limit lines to 80 characters where possible\u003c/a\u003e; unfortunately, \u003cb\u003egit cl format \u003c/b\u003ewill not do this for you.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eAfter committing the patch, you can view the rendered markdown using a URL like https://chromium.googlesource.com/chromium/src/+/master/\u0026lt;my path\u0026gt;/README.md (\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/core/paint/README.md\"\u003eexample\u003c/a\u003e).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://cs.chromium.org/search/?q\u003dfile:readme.md+-file:/third_party/\u0026amp;type\u003dcs\"\u003eHere are some more examples\u003c/a\u003e to learn from.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/markdown-documentation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1848963528989568506"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1848963528989568506"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1848963528989568506"}],"author":[{"name":{"$t":"Chris Harrelson"},"email":{"$t":"chrishtr@chromium.org"}}],"sites$pageName":{"$t":"markdown-documentation"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/592287473962638387"},"published":{"$t":"2019-07-15T14:16:18.848Z"},"updated":{"$t":"2019-07-15T14:30:51.922Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-15T14:28:24.970Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Ecosystem infra"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ci\u003eLast updated: July 2019\u003c/i\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-style:italic;font-weight:bold;background-color:transparent;font-size:10pt\"\u003e\"Establish the infrastructure and culture of testing for the web ecosystem to ensure a predictable experience.\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-style:italic;font-weight:bold;background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOur vision is for the web platform to be engineered as a single, cohesive product. As a natural outcome of our engineering practices and norms, a change to any one part of the ecosystem reliably propagates to all others, with minimal friction. The top priority is real-world interoperability of implementations; standards and tests are important means to that end.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://bit.ly/ecosystem-infra\" rel\u003d\"nofollow\"\u003eTeam Charter\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/ecosystem-infra"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/592287473962638387"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/592287473962638387"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/592287473962638387"}],"author":[{"name":{"$t":"Luke Bj"},"email":{"$t":"lukebjerring@chromium.org"}}],"sites$pageName":{"$t":"ecosystem-infra"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1637095584843601485"},"published":{"$t":"2013-11-09T02:22:55.565Z"},"updated":{"$t":"2019-07-14T07:48:20.647Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-03-20T01:39:28.939Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"python-mock"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003eThe python \"mock\" library is the preferred mocking library for python unittests in the Chromium OS source.  There still exist many tests that use \"mox\", but \"mock\" is preferred for all new tests.  \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003epython-mock is the standard mocking framework starting in Python 3.3 (imported as unittest.mock).\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Setup\" /\u003eSetup\u003c/h3\u003e\u003cp style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003epython-mock is already added to the chroot, but people who run unit tests outside the chroot need to manually install it. Here are the commands to run: \u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\" /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:12.666666984558105px\"\u003e\u003ccode\u003esudo apt-get purge python-mock\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:12.666666984558105px\"\u003e\u003ccode\u003esudo apt-get install python-pip\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:12.666666984558105px\"\u003e\u003ccode\u003esudo pip install mock\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Summary\" /\u003eSummary\u003c/h3\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003e\u003cp\u003eUnlike pymox, python-mock is really easy to extend - no messing with ReplyAll()'s, VerifyAlls(), etc.  It's also more pythonic.  Here's a quick snippet of running a test with somemodule.func() mocked out:\u003c/p\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003eimport somemodule\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003ewith patch.object(somemodule, 'func') as mocked_f:\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  mocked_f.returnvalue \u003d 5\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  ret \u003d somemodule.func('arg1', 'arg2')\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  assertEquals(ret, 5)\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  mocked_f.assert_called_once_\u003c/code\u003e\u003ccode\u003ewith('arg1', 'arg2')\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Documentation\" /\u003eDocumentation\u003c/h3\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eTake a look at python-mock \u003c/span\u003e\u003ca href\u003d\"http://www.voidspace.org.uk/python/mock/\" style\u003d\"background-color:transparent;font-size:10pt;color:rgb(17,85,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003edocs\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThere's also a \u003c/span\u003e\u003ca href\u003d\"http://pyvideo.org/video/392/pycon-2011--testing-with-mock\" style\u003d\"background-color:transparent;font-size:10pt;color:rgb(17,85,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003etalk\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e given by the author on how to test with python-mock.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-partial_mock.py\" /\u003epartial_mock.py\u003c/h3\u003e\u003cp\u003eIn the chromite source there is a partial mocking library, located at lib/partial_mock.py.  This extends python-mock to allow for writing re-usable mocks.  An example is the cros_build_lib_unittest.RunCommandMock class, which can be used to easily simulate command line behavior.  Here's a code snippet of a function we want to test:\u003c/p\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003edef func():\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  try:\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e    result \u003d cros_build_lib.RunCommand(\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e        ['./some_command'], redirect_stdout\u003dTrue, redirect_stderr\u003dTrue)\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e    return 'passcode' in result.output\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  except RunCommandError as e:\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e    if (e.result.returncode \u003d\u003d 2 and \u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e        'monkey' in e.result.error):\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e      return False\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e    raise\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003eHere's how we'd test it with the RunCommandMock partial mock:\u003c/p\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003efrom cros_build_lib_unittest import RunCommandMock, RunCommandError\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003ewith RunCommandMock() as pmock:\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  pmock.AddCmdResult(['./some_\u003c/code\u003e\u003ccode\u003ecommand'], returncode\u003d2, error\u003d'12 monkeys')\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  assertEquals(func(), False)\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003ccode\u003e  pmock.AddCmdResult(['./some_\u003c/code\u003e\u003ccode\u003ecommand'], returncode\u003d1)\u003c/code\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  assertRaises(RunCommandError, func)\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003ccode\u003e  pmock.AddCmdResult(['./some_\u003c/code\u003e\u003ccode\u003ecommand'], output\u003d'passcode')\u003c/code\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  assertEquals(func(), True)\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003eNo mucking with setting up mock CommandResults, or mock RunCommandErrors, or testing for the right redirect_* or error_code_ok\u003dTrue arguments.  The partial mock handles all of that for you by using RunCommand logic directly.  \u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eIt's also easy to write your own partial mocks that can then be used by other unit tests.  Having a corpus of re-usable mocks will make the barrier to testing lower, and will help us get into a more test-driven development workflow.\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003cp style\u003d\"color:rgb(34,34,34);font-family:arial,helvetica,sans-serif\"\u003eThanks for reading, and happy mocking! :)\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/python-mock"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1637095584843601485"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1637095584843601485"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1637095584843601485"}],"author":[{}],"sites$pageName":{"$t":"python-mock"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"XSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8745496516061430146"},"published":{"$t":"2012-11-30T18:56:11.383Z"},"updated":{"$t":"2019-07-14T06:43:57.746Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-12-26T06:22:08.424Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using an Upstream Kernel on Chrome OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003e\u003cb\u003e\u003cfont size\u003d\"5\"\u003e\u003cp\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:350px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Obtain-source-code-and-recent-patches\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eObtain source code and recent patches\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Installing-pwclient\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eInstalling pwclient\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Patches-relevant-to-the-Samsung-ARM-Chromebook\"\u003e\u003cstrong\u003e4 \u003c/strong\u003ePatches relevant to the Samsung ARM Chromebook\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Building-and-installing-the-kernel\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eBuilding and installing the kernel\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-The-kernel-config\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eThe kernel config\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Making-sure-other-configs-compile\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eMaking sure other configs compile\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Sending-your-change-upstream\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eSending your change upstream\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-is-known-to-work-and-known-to-not-work-\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eWhat is known to work (and known to not work)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Musings\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eMusings\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Contributing\"\u003e\u003cstrong\u003e11 \u003c/strong\u003eContributing\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/p\u003eIntroduction\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThis page aims to document how to use an Upstream Kernel on Chrome OS.  It's aimed at helping people with upstreaming for \u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003ethe \u003c/span\u003e\u003ca href\u003d\"http://www.samsung.com/us/computer/chrome-os-devices/XE303C12-A01US\" style\u003d\"font-family:arial,sans-serif;font-size:10pt\" rel\u003d\"nofollow\"\u003eSamsung ARM Series 3 Chromebook\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003e (AKA snow) and uses that in many examples.  However, it's useful in other cases, too.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eIn general this documentation assumes that you've got the Chrome OS source tree synced down and have a build environment (and chroot) setup.  It assumes you've built packages and an image for your board (like \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt\"\u003e\u003cfont color\u003d\"#9900ff\"\u003eBOARD\u003ddaisy\u003c/font\u003e\u003c/code\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003e for the snow board).  See the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\" style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eDeveloper Guide\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003e if you haven't done that.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Obtain-source-code-and-recent-patches\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eObtain source code and recent patches\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe whole point here is to use the upstream kernel, so these instructions will direct you to linux-next.  ...but linux-next is pretty darn bleeding edge.  If you get stuck and things won't boot, you could always try a known-good state.  In fact, many of the needed patches have now landed on even landed on the main linux tree now.  See the section below \"Patches relevant to the Samsung ARM Chromebook\" for the last known good state.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eThe easiest way to get source code is to just add a remote git server to your normal kernel tree, fetch things, and then use patchwork to apply some patches.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eHere's some steps to do that and start a new work branch on linux-next.  WARNING: The fetch might be slow.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003ecd ~/trunk/src/third_party/kernel/files\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003egit remote add linuxnext git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003egit fetch linuxnext\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003egit checkout -b my_branch linuxnext/master\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Installing-pwclient\" /\u003eInstalling pwclient\u003c/h2\u003e\u003cp\u003eNow that you've got the source code you should apply a few patches.  In this case we'll use \u003ccode\u003epwclient\u003c/code\u003e to get things out of \u003ca href\u003d\"http://patchwork.kernel.org\" rel\u003d\"nofollow\"\u003epatchwork.kernel.org\u003c/a\u003e.  \u003c/p\u003e\u003cp\u003eFirst we need to install \u003ccode\u003epwclient\u003c/code\u003e.\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eOne way to install the patchwork client \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ein the cros chroot is via its ebuild:\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo emerge pwclient\u003c/code\u003e\u003c/div\u003e\u003c/font\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAlternatively, you can install the latest pwclient directly from kernel.org:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"line-height:13.3333320617676px\" /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"line-height:13.3333320617676px\"\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003esudo bash -c \"curl 'https://patchwork.kernel.org/pwclient/' \u0026gt; /usr/local/bin/pwclient\"\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:13.3333320617676px\"\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003esudo chmod +x /usr/local/bin/pwclient\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003cdiv\u003e\u003cdiv\u003eNext, setup the \u003ccode\u003e.pwmclientrc\u003c/code\u003e for the LKML project on patchwork.kernel.org:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb style\u003d\"color:rgb(153,0,255);font-family:monospace;line-height:1;font-size:10pt\"\u003e\u003ccode\u003e# The following will clobber any existing ~/.pwclientrc you have (!)\u003c/code\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\" face\u003d\"monospace\"\u003e\u003ccode\u003ecurl 'https://patchwork.kernel.org/project/LKML/pwclientrc/' \u0026gt; ~/.pwclientrc\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Patches-relevant-to-the-Samsung-ARM-Chromebook\" /\u003ePatches relevant to the Samsung ARM Chromebook\u003c/h2\u003e\u003cp\u003eThis section should go away eventually once patches are upstream...\u003c/p\u003e\u003cp\u003eRelevant patch series that I've tested (as of 12/19/12)\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://patchwork.kernel.org/bundle/dianders/mmc_wp/\" style\u003d\"font-size:10pt\" rel\u003d\"nofollow\"\u003eSD card write protect patches\u003c/a\u003e \u003cb\u003e(required)\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://patchwork.kernel.org/bundle/dianders/i2c_bus_numbering/\" style\u003d\"font-size:10pt\" rel\u003d\"nofollow\"\u003ei2c bus numbering patches\u003c/a\u003e \u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://patchwork.kernel.org/bundle/dianders/snow_max77686/\" rel\u003d\"nofollow\"\u003emax77686 basic support in device tree\u003c/a\u003e (misses RTC + 32KHz clocks)\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eQuick way to apply:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003efor id in 1966801 1966931 1966871 1966781 1966811; do\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003e  pwclient git-am $id\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003edone\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ccode\u003epwclient git-am \u003c/code\u003e\u003c/font\u003e\u003cfont color\u003d\"#9900ff\" face\u003d\"monospace\"\u003e\u003ccode\u003e1966911\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,255)\"\u003e\u003ccode\u003epwclient git-am \u003c/code\u003e\u003c/span\u003e\u003cfont color\u003d\"#9900ff\" face\u003d\"monospace\"\u003e\u003ccode\u003e1840211\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003eStatus on linux/master:\u003cul\u003e\u003cli\u003eTested on 12/18 \u003ccode\u003eae664dba2724e59ddd66291b895f7370e28b9a7a: Merge branch 'slab/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/linux\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eNeeded revert of \u003ccode\u003e1974a042dd15f1f007a3a1a2dd7a23ca0e42c01d\u003c/code\u003e.  Fix is in discussion upstream.\u003c/li\u003e\u003cli\u003eApplied patches (1823551 1823621 1823561 1823591 1781931 1840211 1894081)\u003c/li\u003e\u003cli\u003eBoots to command line\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eTested on 12/19 \u003ccode\u003e74779e22261172ea728b989310f6ecc991b57d62: Merge tag 'for-3.8-rc1' of git://gitorious.org/linux-pwm/linux-pwm\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eNeeded revert of \u003ccode\u003e1974a042dd15f1f007a3a1a2dd7a23ca0e42c01d\u003c/code\u003e.  Fix is in discussion upstream.\u003c/li\u003e\u003cli\u003eApplied patches (1823551 1823621 1823561 1823591 1781931 1840211)\u003c/li\u003e\u003cli\u003eTo fix DEPMOD step when doing emerge-daisy chromeos-kernel-3_8: Apply patch 2794701\u003c/li\u003e\u003cli\u003eBoots to command line\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003eStatus on linux-next/master:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eTested on 12/6: \u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003ecfc4410f5d3de0f68139ddffe065b9889a41d3c0\u003c/font\u003e\u003ccode style\u003d\"font-size:10pt\"\u003e: Add linux-next specific files for 20121206\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eApplied above patches (1823551 1823621 1823561 1823591 1781931 1840211)\u003c/li\u003e\u003cli\u003eBoots to command line\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eTested on 12/18: \u003ccode\u003eff430f8aa011716b8274381e31b0bc8d49d4f4be: Add linux-next specific files for 20121218\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eApplied patches (1823551 1823621 1823561 1823591 1781931 1840211 1894081)\u003c/li\u003e\u003cli\u003eBoots to command line\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Building-and-installing-the-kernel\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eBuilding and installing the kernel\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCertainly there are lots of ways to build and install the kernel.  I'm not going to copy them all here but I'll just point you at the \u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-faq\"\u003eKernel FAQ\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  Specifically read the \u003ca href\u003d\"http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-faq#TOC-How-to-quickly-test-kernel-modifications-the-fast-way-\"\u003eHow to quickly test kernel modifications (the fast way)\u003c/a\u003e section carefully.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eI would strongly suggest that you boot from a fast SD card rather than directly messing with what you have on eMMC.  That way you can always get back to a running system.  The quick set of steps for that is:\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003eSwitch to \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook\" style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003edeveloper mode\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eAt the command prompt (VT2), enable USB (and SD card) booting with \u003ccode\u003e\u003cfont color\u003d\"#990000\"\u003e\u003cfont size\u003d\"3\"\u003ecrossystem dev_boot_usb\u003d1\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e.\u003ccode\u003e\u003cfont color\u003d\"#990000\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/code\u003eNote: the exact method might differ between boards; see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices\"\u003eDeveloper Information for Chrome OS Devices page\u003c/a\u003e for specific details.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003eInsert an SD card with an image that you installed with \u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/build/cros-flash\"\u003ecros flash\u003c/a\u003e\u003c/font\u003e\u003c/code\u003e\u003c/span\u003e.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003eReboot your Chromebook and press \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt\"\u003e\u003cfont color\u003d\"#990000\"\u003eCtrl-U\u003c/font\u003e\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003e at the BIOS prompt to boot from your SD card.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYou might also want to look at \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:6ae80f627ae80bf6\" class\u003d\"disabled\"\u003eUsing nv-U-Boot on the Samsung ARM Chromebook\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-The-kernel-config\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe kernel config\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eOne especially weird thing when working with the upstream kernel is that standard ChromeOS kernel \u003ccode\u003esplitconfig\u003c/code\u003e system isn't in place.  The kernel ebuild used by ChromeOS will realize that and will pick up a backup config from \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/cros-kernel\"\u003echromiumos-overlay\u003c/a\u003e.  On snow it will pick up the \u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ccode\u003eexynos5_defconfig\u003c/code\u003e in particular.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you need to make changes to the kernel config locally the easiest thing to do is to just override that config.  Here's a set of commands that might suit you:\u003c/font\u003e\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eDEFCONFIG\u003d~/trunk/src/third_party/chromiumos-overlay/eclass/cros-kernel/exynos5_defconfig\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003ecd ~/trunk/src/third_party/kernel/v3.8\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003ecp ${DEFCONFIG} .config\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eARCH\u003darm make menuconfig\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e# Make your changes\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003eARCH\u003darm make savedefconfig\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003ecp defconfig ${DEFCONFIG}\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003emake mrproper\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you have changes to the config that you think is relevant to others working on the upstream kernel then feel free to submit a patch!\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Making-sure-other-configs-compile\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMaking sure other configs compile\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIt's hard to make 100% sure that your change won't break anyone else.  ...but it's usually considered courtesy to make sure that some other boards compile.  If you want to see if the \u003ccode\u003eexynos4_defconfig\u003c/code\u003e compiles you could use a recipe like this:\u003c/font\u003e\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,255);font-family:monospace;line-height:1;font-size:10pt\"\u003e\u003ccode\u003ecd ~/trunk/src/third_party/kernel/v3.8\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\" face\u003d\"monospace\"\u003e\u003ccode\u003eARCH\u003darm CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi- make exynos4_defconfig\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900ff\" face\u003d\"monospace\"\u003e\u003ccode\u003eARCH\u003darm CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi- make -j16\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,255);font-family:monospace;line-height:1;font-size:10pt\"\u003e\u003ccode\u003emake mrproper\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003eThe \u003ccode\u003eexynos4_defconfig\u003c/code\u003e is particularly interesting when you're modifying exynos code because it is a non-device tree enabled board that shares a lot of code with the exynos config that we're using (so it's easy to break).  It's actually broken at the git hash I listed above because I didn't run it before submitting my last patch.  :(\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Sending-your-change-upstream\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSending your change upstream\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThis is documented over at \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt\"\u003ethe \u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;font-family:arial,sans-serif\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-faq\"\u003eKernel FAQ\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt\"\u003e, which will soon (hopefully) include the use of patman.\u003c/font\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-is-known-to-work-and-known-to-not-work-\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhat is known to work (and known to not work)\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAs of 11/30/12:\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWorks:\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSerial over UART3 (if you've got a \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/servo\"\u003eservo2 debug board\u003c/a\u003e hooked up).  ...though remember that the default BIOS will try to disable serial console by mucking with the kernel command line.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ei2c (all busses except the very important i2c bus 4)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003epower button and lid switch\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eEMMC and SD\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eKnown not to work yet:\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eX (so ui will crash a whole lot at bootup)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUSB 2.0 - Can almost do this with patches posted, expect it real soon now.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUSB 3.0\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ei2c4 (which means no keyboard and no tps65090 PMIC)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDisplay\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHDMI\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt\"\u003eWiFi\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emax77686 RTC + 32KHz\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTrackpad\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAudio\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Musings\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMusings\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eA few random thoughts:\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you end up flashing a bad kernel a lot, it's a lot easier to use the \"nv-U-Boot\" (formerly known as legacy U-Boot).  There's now documentation for how to do this at \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:6ae80f627ae80bf6\" class\u003d\"disabled\"\u003eUsing nv-U-Boot on the Samsung ARM Chromebook\u003c/a\u003e.  Pay special attention to the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:6ae80f627ae80bf6#TOC-Booting-from-a-backup-kernel\" class\u003d\"disabled\"\u003eBooting from a backup kernel\u003c/a\u003e section, which is really helpful when dealing with lots of nonbooting kernels.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you have access to a servo board (probably only people at Google will have these) you also have the option of using \u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecros_bundle_firmware\u003c/font\u003e\u003c/code\u003e to load up a kernel.  The magic command line I've used for this is as follows.  Note that this won't get you kernel modules, just the main kernel.\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecros_bundle_firmware -b daisy -d exynos5250-snow -w usb --kernel /build/daisy/boot/vmlinux.uimg\u003c/font\u003e\u003c/code\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Contributing\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eContributing\u003c/font\u003e\u003c/h2\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePatches are certainly appreciated as are reviews of patches posted upstream.  In general most people on the Chrome OS team wouldn't object to people taking patches from the Chrome OS kernel tree, adjusting them, and posting them upstream (check with the author, though, since people may be midway through doing that themselves).\u003c/font\u003e\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/using-an-upstream-kernel-on-snow"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8745496516061430146"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8745496516061430146"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8745496516061430146"}],"author":[{"name":{"$t":"Douglas Anderson"},"email":{"$t":"dianders@chromium.org"}}],"sites$pageName":{"$t":"using-an-upstream-kernel-on-snow"},"sites$revision":{"$t":"24"}},{"gd$etag":"\"Xil7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7510377848164588562"},"published":{"$t":"2014-11-18T01:04:58.943Z"},"updated":{"$t":"2019-07-10T21:00:39.852Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-10T21:00:35.526Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Media Router \u0026 Web Presentation API"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\" size\u003d\"6\"\u003eThis document is obsolete and will be removed soon.  \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/refs/heads/master/docs/media/media_router.md\" target\u003d\"_blank\"\u003eThe new version is here\u003c/a\u003e.\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eThe media router is a component in Chrome responsible for matching clients that wish to render content outside the browser (\u003ci\u003emedia sources\u003c/i\u003e) with devices and endpoints capable of rendering that content (\u003ci\u003emedia sinks\u003c/i\u003e).  When a media source is linked with a m\u003ci\u003eedia sink\u003c/i\u003e (in general, requiring user permission), a \u003ci\u003emedia route\u003c/i\u003e is created that allows two-way messaging between the client and the sink.  The media route allows the client to negotiate a peer-to-peer media streaming session with the media sink via messaging (e.g., via \u003ca href\u003d\"http://www.webrtc.org/\" target\u003d\"_blank\"\u003eWebRTC\u003c/a\u003e or \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/renderer/extensions/cast_streaming_native_handler.h\u0026amp;q\u003dcast_streaming\u0026amp;sq\u003dpackage:chromium\u0026amp;type\u003dcs\" target\u003d\"_blank\"\u003eCast Streaming\u003c/a\u003e), aka \"mirroring.\"  The media route can also be used to control remotely rendered media without an associated peer-to-peer media streaming session, aka \"flinging\".  The media route can be terminated at user or client request, which denies access to the media sink from the application.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe Web \u003ca href\u003d\"http://www.w3.org/2014/secondscreen/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ePresentation API\u003c/a\u003e allows a Web application to request display of Web content on a secondary (wired, or wireless) screen.  The content may be rendered locally and streamed to the display or rendered remotely.  The Web application controls the content by two-way messaging.\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that the non-Blink parts of the media router will be implemented only in desktop Chrome and ChromeOS.  Presentation API functionality will be implemented in Chrome for Android using analogous platform components such as the \u003ca href\u003d\"https://developer.android.com/guide/topics/media/mediarouteprovider.html\" target\u003d\"_blank\"\u003eAndroid Media Route Provider framework\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAlso note that a separate design is in progress for offscreen rendering, capture, and streaming of WebContents (required for full Presentation API support).\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Objectives\" /\u003eObjectives\u003c/h2\u003e\r\n\u003cdiv\u003eThe objectives of this project:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAllow use of media sinks from a multitude of clients, including:  Web applications via the \u003ca href\u003d\"http://w3c.github.io/presentation-api/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ePresentation API\u003c/a\u003e; Chrome apps; the browser itself; and the Chrome OS system shell.\u003c/li\u003e\r\n\u003cli\u003eSupport mirroring locally rendered content to external screens, including on-screen and off-screen tabs, Chrome apps windows, and the system desktop.\u003c/li\u003e\r\n\u003cli\u003eSupport \"flinging\" HTML5 documents to remote devices capable of rendering them.\u003c/li\u003e\r\n\u003cli\u003eSupport the \u003ca href\u003d\"https://developers.google.com/cast/docs/reference/chrome/\" target\u003d\"_blank\"\u003eCast Chrome Sender SDK\u003c/a\u003e on desktop and Android without any user installed extensions.\u003c/li\u003e\r\n\u003cli\u003eAllow new types of media sinks to be added to Chrome by implementing additional Media Route Providers.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe following are non-goals but may be objectives for future work:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eMulticast of local content to multiple sinks at once.\u003c/li\u003e\r\n\u003cli\u003eSupport for third party media route providers (in Javascript or NaCl) or run-time installation of media route providers.\u003c/li\u003e\r\n\u003cli\u003eSupport for sinks that are not primarily intended to render media.\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eThe media router consists of four distinct components:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eThe Chrome Media Router is a browser service exposed in-process via C++ API and is exposed to other processes via a set of two Mojo interfaces:  the Presentation interface and the Media Router API interface.  Its job is to field requests from clients for media sink availability, media route construction/destriction, and media route control via messaging.  It also controls the Media Router Dialog and delegates many functions to the Media Router component extension.\u003c/li\u003e\u003cli\u003eThe Media Router extension is an external component extension responsible for direct interaction with media sinks.  The component extension will initially support use of \u003ca href\u003d\"http://www.google.com/cast/\" target\u003d\"_blank\"\u003eCast\u003c/a\u003e and \u003ca href\u003d\"http://www.dial-multiscreen.org/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eDIAL\u003c/a\u003e devices with more types of sinks to be added over time.  The component extension interacts with the Chrome Media Router via the Media Router API Mojo service, and uses some chrome.* platform APIs, such as chrome.dial, chrome.cast.channel, and chrome.mdns to implement network level interaction with Cast and DIAL devices.\u003c/li\u003e\u003cli\u003eUsers interact with the Chrome Media Router through the Media Router Dialog.  This WebUI component allows users to choose the destination media sink for new media routes and view and stop active media routes.  It may be pulled up by the user clicking the Cast icon in the browser toolbar, or at the request of a Web application via the Presentation API.\u003c/li\u003e\u003cli\u003eThe Presentation Mojo interface acts as a bridge between the Chrome Media Router and the Blink implementation of the Presentation API (\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d412331\" target\u003d\"_blank\"\u003elaunch bug\u003c/a\u003e).\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Architecture\" /\u003eArchitecture\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe following diagram illustrates the architecture of the components described above.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\" /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router/Chrome%20Media%20Router%20Architecture%20%281%29.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1423182643815/developers/design-documents/media-router/Chrome%20Media%20Router%20Architecture%20%281%29.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Chrome-Media-Router\" /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eChrome Media Router\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe Chrome Media Router is a browser-resident service that serves as a media-protocol-agnostic platform for parties interested in media routing. It provides its clients with a set of APIs for media routing related queries and operations, including:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13px\"\u003eRegister for notifications when a sink is available that can render a media source.  (Media sources are represented as URIs and can represent local media or remotely hosted content.)\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eRequest routing of media for that source, which will show the user the media router dialog to select a compatible sink.  If the user selects a sink, the media route is returned to the application to allow it to control media playback.\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eAccept media control actions from the Media Router Dialog \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003efor an active media route and forwarding them to the associated route provider.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003eSend and receive arbitrary (string) messages between the application the media sink.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eTerminate media routes, and notify the client and media route provider when that happens.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe Chrome Media Router, itself, does not directly interact with media sinks. Instead it delegates these requests and responses to a media route provider in the component extension. The\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e Chrome Media Router will contain bookkeeping of established routes, pending route requests, and other related resources, so it does not have to request this information from the route provider each time.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe following pseudocode describes how a client of the Chrome Media Router (through its C++ API) would use it to initiate and control a media sharing session.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eMedia Router API Example\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-text\"\u003e\u003cdiv class\u003d\"sites-embed-content-textbox\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode style\u003d\"display:block;white-space:pre\"\u003e\r\nMediaRouter* media_router \u003d MediaRouterImpl::GetInstance();\r\n\r\n// Find out what screens are capable of rendering, e.g.\r\n// www.youtube.com\r\nMediaSource youtube_src \u003d MediaSource::ForPresentationUrl(\"http://www.youtube.com\");\r\n\r\n// MyMediaSinksObserver should override MediaSinksObserver::OnSinksReceived to handle updates to\u003c/code\u003e\u003ccode style\u003d\"display:block;white-space:pre\"\u003e// the list of screens compatible with youtube_src\r\nMediaSinksObserver* my_observer \u003d new MyMediaSinksObserver(youtube_src);\r\nmedia_router-\u0026gt;RegisterObserver(my_observer);\r\n\r\n// Ask the user to pick a screen from the list passed to\u003c/code\u003e\u003ccode style\u003d\"display:block;white-space:pre\"\u003e// my_observer and capture the sink_id (code not shown)\r\n\r\n// Request routing of media for that source.\u003c/code\u003e\u003ccode style\u003d\"display:block;white-space:pre\"\u003e// |callback| is passed a MediaRouteResponse\u0026amp; that contains a MediaRoute result if successful.\r\nmedia_router-\u0026gt;StartRouteRequest(youtube_src, sink_id, callback);\r\n\r\n// The MediaRoute can be used to post messages to the\r\n// sink. \r\nmedia_router-\u0026gt;PostMessage(media_route.media_route_id, \"some data\", \"optional_extra_data_json\");\r\n\r\n// The MediaRoute can be closed which signals the sink\r\n// to terminate any remote app or media streaming\r\n// session.\r\nmedia_router-\u0026gt;CloseRoute(media_route.media_route_id);\r\n\u003c/code\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe Media Router interacts with the component extension via a Mojo service, the Media Router API, that exposes functionality whose implementation is delegated to the extension.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eMedia Router API Mojo Interface\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-text\"\u003e\u003cdiv class\u003d\"sites-embed-content-textbox\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cpre\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e// Interface for sending messages from the MediaRouter (MR) \r\n// to the Media Router Provider Manager (MRPM). \r\ninterface MediaRouterApiClient { \r\n // Signals the media route manager to route the media located \r\n // at |source_urn| to |sink_id|. \r\n RequestRoute(int64 request_id, string source, string sink_id); \r\n \r\n // Signals the media route manager to close the route specified by |route_id|. \r\n CloseRoute(string route_id); \r\n \r\n // Signals the media route manager to start querying for sinks \r\n // capable of displaying |source|. \r\n AddMediaSinksQuery(string source); \r\n \r\n // Signals the media route manager to stop querying for sinks \r\n // capable of displaying |source|. \r\n RemoveMediaSinksQuery(string source); \r\n \r\n // Sends |message| with optional |extra_info_json| via the media route \r\n // |media_route_id|. \r\n // |extra_info_json| is an empty string if no extra info is provided. \r\n PostMessage(string media_route_id, string message, string extra_info_json); \r\n}; \r\n \r\n// Interface for sending messages from the MRPM to the MR. \r\n[Client\u003dMediaRouterApiClient] \r\ninterface MediaRouterApi { \r\n // Called when the provider manager is ready. \r\n OnProviderManagerReady(string extension_id); \r\n \r\n // Called when the Media Route Manager receives a new list of sinks. \r\n OnSinksReceived(string source, \r\n array\u0026lt;MediaSink\u0026gt; sinks, \r\n array\u0026lt;MediaRoute\u0026gt; routes); \r\n \r\n // Called after a MediaRoute is established. \r\n OnRouteResponseReceived(int64 request_id, MediaRoute route); \r\n \r\n // Called when route establishment fails. \r\n OnRouteResponseError(int64 request_id, string error_text); \r\n}; \u003c/code\u003e\u003c/div\u003e\u003c/font\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Media-Router-Component-Extension\" /\u003eMedia Router Component Extension\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe component extension manages discovery of and network interaction with individual media sinks. For the purposes of this discussion a sink is a LAN-connected device that speaks the Cast or DIAL protocol, but in theory it could be any other type of endpoint that supports media rendering and two-way messaging. The extension consists of three types of components:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eMedia Route Providers: Each provider is a Javascript bundle that knows how to find and communicate with a specific type of media sink. It communicates with the media sink using HTTP/XHR or via device-specific network protocols (e.g., Cast Channel and Cast Streaming).\u003c/li\u003e\u003cli\u003eMedia Route Provider Manager: This is responsible for dispatching requests from the Chrome Media Router to individual providers. It also registers providers on startup.\u003c/li\u003e\u003cli\u003eMirroring Service: If a media source is requested that represents the tab or desktop contents, this service acts on the behalf of the application to initiate the mirroring session. This is handled internally to the component extension and is not exposed to the rest of the browser, it appears to be just another media route.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eA component extension is used rather than implementing functionality directly into the browser since remote display functionality is implemented by first and third parties using a mix of open source and proprietary code, and must be released on a schedule independently of Chrome (i.e. tied to specific hardware release dates). We only plan to open source the DIAL media route provider.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe component extension is written in JavaScript using the Closure library and will be available via two public channels; the default, “stable” extension will be installed as an external component without the user needing to visit the Web Store. Users may choose to install a pre-release “beta” extension via the Web Store, which disables the stable version.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eInitially Media Route Providers will be implemented for Cast and DIAL devices with others to follow. Over time media route providers that do not rely on proprietary protocols will be unbundled and included in the Chromium repository, once script packaging and deployment issues are resolved. \u003cspan style\u003d\"background-color:transparent\"\u003eAs an external component, the extension is installed on the initial run of the browser. It is built around an event page so it registers itself with the Media Router, registers itself with discovery APIs to be notified of display availability, and then suspends. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThe component extension will only be active when there are applications with pending sink availability requests or media routes, or when there is active network traffic between the extension and a media sink.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThere are several modules to the extension that are loaded on-demand. The main event page bundles are 238kb. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eUpdates are independent of Chrome.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Tab-Desktop-Mirroring-\" /\u003eTab/Desktop Mirroring \u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTab and desktop mirroring will request routing of a media source with URN like \u003cfont face\u003d\"courier new, monospace\"\u003eurn:google:tab:3\u003c/font\u003e representing tab contents.  When the component extension receives a request to route this source, the media route provider manager will query route providers to enumerate sinks that can render streamed tab contents.  Once a sink is selected by the user, the mirroring service will create the appropriate MediaStream using the \u003cfont face\u003d\"courier new, monospace\"\u003echrome.tabCapture\u003c/font\u003e extension API.  The MediaStream will then be passed to a Cast Streaming or WebRTC session depending on the preferred protocol of the selected sink.  When the media route is terminated, the associated streaming session and media capture are also terminated.  A similar approach will be used for desktop mirroring but using \u003cfont face\u003d\"courier new, monospace\"\u003echrome.desktopCapture\u003c/font\u003e instead.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Presentation-API\" /\u003ePresentation API\u003c/h2\u003e\u003cdiv\u003eMedia routing of Web content will primarily be done through the Presentation API.  Some media sinks (e.g. Cast) can render a subset of Web content natively, or render an equivalent app experience (e.g., via DIAL).  For generic Web documents, we plan on rendering it in an offscreen WebContents and then using the Tab Mirroring approach outlined above.  The design of the offscreen rendering capability will be added later to this document.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe Presentation API implementation in Blink will live in content/ and will operate on the frame level. It will delegate the calls to the embedder's Media Router implementation (Android Media Router / Chrome Media Router for Android / Chrome, respectively) via a common PresentationServiceDelegate interface.  A draft Mojo interface follows (not yet complete):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003ePresentationService Mojo interface\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-text\"\u003e\u003cdiv class\u003d\"sites-embed-content-textbox\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cpre\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003einterface PresentationService { \r\n // Returns the last screen availability state if it’s changed since the last \r\n // time the method was called. The client has to call this method again when \r\n // handling the result (provided via Mojo callback) to get the next update \r\n // about the availability status. \r\n // May start discovery of the presentation screens. The implementation might \r\n // stop discovery once there are no active calls to GetScreenAvailability. \r\n // |presentation_url| can be specified to help the implementation to filter \r\n // out incompatible screens. \r\n GetScreenAvailability(string? presentation_url) \u003d\u0026gt; (bool available); \r\n \r\n // Called when the frame no longer listens to the \r\n // |availablechange| event. \r\n OnScreenAvailabilityListenerRemoved(); \r\n}; \u003c/code\u003e\u003c/div\u003e\u003c/font\u003e\u003c/pre\u003e\r\n\r\n\r\n\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHere is how the presentation API will roughly map to Chrome Media Router API:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:14px\"\u003e \u003cb\u003ePresentation API\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:14px\"\u003e\u003cb\u003eChrome Media Router \u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eAdding \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eonavailablechange\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e listener\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cspan style\u003d\"font-size:10pt;font-family:courier new,monospace;background-color:transparent\"\u003eRegisterObserver()\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, with result propagated back to the RenderFrame / Presentation API.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cspan style\u003d\"font-family:courier new,monospace\"\u003estartSession\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e Opens Media Router Dialog (via MediaRouterDialogController) -\u0026gt; User action -\u0026gt; \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eStartRouteRequest()\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ejoinSession\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cfont face\u003d\"courier new, monospace\"\u003eStartRouteRequest()\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cspan style\u003d\"font-family:courier new,monospace\"\u003epostMessage\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cfont face\u003d\"courier new, monospace\"\u003ePostMessage()\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eclose\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cfont face\u003d\"courier new, monospace\"\u003eCloseRoute()\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cfont face\u003d\"arial, sans-serif\"\u003eAdding \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eonmessage\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e listener\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cfont face\u003d\"courier new, monospace\"\u003eRegisterMessageObserver() \u003c/font\u003e(tentative)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:229px;height:15px\"\u003e \u003cfont face\u003d\"arial, sans-serif\"\u003eAdding \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eonstatechange\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e listener\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:642px;height:15px\"\u003e \u003cfont face\u003d\"courier new, monospace\"\u003eRegisterRouteStateChangeObserver() \u003c/font\u003e(tentative)\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Media-Router-Dialog\" /\u003eMedia Router Dialog\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent\"\u003eEnd user control of media routing is done through the Media Router Dialog.  The m\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"background-color:transparent\"\u003eedia router dialog is a constrained, tab modal dialog implemented using WebUI. It auto-resizes to fit the currently rendered contents and appears in the top center of the browser. The dialog supports a number of views, including a screen selector, screen status, error/warning messages, and informational messages. To avoid excess whitespace, the dialog appropriately resizes to the current view.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-The-media-router-dialog-is-activated-by-clicking-on-the-Cast-icon-which-is-always-available-to-the-user.-The-Cast-icon-implements-the-action-icon-interface-and-appears-on-either-the-toolbar-action-menu-normally-or-in-the-omnibox-if-there-is-an-available-Ca\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003eThe media router dialog is activated by clicking on the Cast icon, which is always available to the user.  The Cast icon implements the action icon interface and appears on either the toolbar action menu (normally) or in the omnibox if there is an available Casting experience (a detected media sink).  \u003cbr /\u003e\u003cbr /\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router/media_router_overflow.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1418943120195/developers/design-documents/media-router/media_router_overflow.jpg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Clicking-on-the-Cast-icon-brings-up-a-menu-of-available-media-sinks-that-are-compatible-with-the-current-content.-For-Web-documents-not-using-the-Presentation-API-these-will-include-sinks-that-can-render-tab-or-desktop-capture.-For-Web-documents-it-will-in\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003eClicking on the Cast icon brings up a menu of available media sinks that are compatible with the current content.  For Web documents not using the Presentation API, these will include sinks that can render tab or desktop capture.  For Web documents, it will include media sinks compatible with the URL requested to be presented through the Presentation API (once we are able to declare this URL through the API and proactively filter to compatible displays).\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Media-Route-providers-may-customize-the-appearance-of-the-active-media-activity-and-inject-custom-controls-into-the-WebUI-subject-to-UX-guidelines-.-We-are-prototyping-this-approach-using-extensionview-.The-Media-Router-Dialog-Controller-keeps-track-of-whe\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router/media_router_screen_selector.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1418944081776/developers/design-documents/media-router/media_router_screen_selector.jpg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eMedia Route providers may customize the appearance of the active media activity and inject custom controls into the WebUI (subject to UX guidelines).  We are prototyping this approach using \u0026lt;extensionview\u0026gt;.\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router/media_router_universal_remote.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1418943383223/developers/design-documents/media-router/media_router_universal_remote.jpg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003eThe Media Router Dialog Controller keeps track of whether or not the initiator tab is currently open. When the tab is closed or navigated away to another URL, the media router dialog is closed.\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003eThe HTML resources are built using \u003ca href\u003d\"https://www.polymer-project.org/\" target\u003d\"_blank\"\u003ecustom Polymer elements\u003c/a\u003e. Data is passed between the WebUI and backend by calling the following:\u003cbr /\u003e\u003cbr /\u003eWebUI: \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13px;font-weight:normal\"\u003echrome.send(functionName);\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003eBackend: \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13px;font-weight:normal\"\u003eweb_ui()-\u0026gt;CallJavascriptFunction(function_name, arg, ...);\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cdiv /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router/media_router_ui_diagram.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1418944102075/developers/design-documents/media-router/media_router_ui_diagram.jpg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003eThe WebUI and controller classes are located in the proposed location:\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13px;font-weight:normal\"\u003echrome/browser/ui/webui/media_router\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;background-color:transparent\"\u003e\u003cbr /\u003eThe dialog resources, which include HTML, CSS, JS, and image files, are located in the proposed location:\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13px;font-weight:normal;background-color:transparent\"\u003echrome/browser/resources/media_router\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-We-will-use-the-extensionview-HTML-tag-to-embed-the-custom-media-controller-UX.-This-will-allow-the-component-extension-to-flexibly-customize-and-control-the-UX-instead-of-having-the-functionality-implemented-directly-into-the-browser.-ExtensionView-allows\" /\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003eWe will use the \u0026lt;extensionview\u0026gt; HTML tag to embed the custom media controller UX. This will allow the component extension to flexibly customize and control the UX instead of having the functionality implemented directly into the browser. \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003eExtensionView allows us to embed a page from the component extension into the Media Router WebUI. We will use the load API to take in the full media controller URL.\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eThe extension will utilize \u003ca href\u003d\"https://developer.chrome.com/extensions/runtime\"\u003echrome.runtime.*\u003c/a\u003e functionality to message between the controller embedded in the ExtensionView and the extension itself.\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Offscreen-Rendering\" /\u003eOffscreen Rendering\u003c/h2\u003e\u003cdiv\u003eTODO(miu)\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Security\" /\u003eSecurity\u003c/h2\u003e\u003cdiv\u003eThe entire project should be security reviewed from a holistic and architectural perspective.  Specific security-related aspects:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThe Chrome Media Router will be designed to have a minimal processing of the URIs and messages passed through it (perhaps only checking for syntactic validity).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eThe Media Router Dialog will allow the MRPs to inject custom content into it, so for example, the inline controls for a game can differ from those for a movie.  This content will be rendered out-of-process in an \u0026lt;extensionview\u0026gt; to prevent any escalation of \u003c/span\u003eprivileges\u003cspan style\u003d\"font-size:10pt\"\u003e from compromised content.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThe individual platform APIs used by the component extension MRPs (chrome.dial, chrome.mdns, chrome.cast.channel, chrome.cast.streaming) have been security reviewed previously.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Team-members\" /\u003eTeam members\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eMark Foltz \u0026lt;\u003ca href\u003d\"mailto:mfoltz@chromium.org\"\u003emfoltz@chromium.org\u003c/a\u003e\u0026gt;, TL\u003c/li\u003e\r\n\u003cli\u003eJennifer Apacible \u0026lt;\u003ca href\u003d\"mailto:apacible@chromium.org\"\u003eapacible@chromium.org\u003c/a\u003e\u0026gt;, WebUI\u003c/li\u003e\r\n\u003cli\u003eDerek Cheng \u0026lt;\u003ca href\u003d\"mailto:imcheng@chromium.org\"\u003eimcheng@chromium.org\u003c/a\u003e\u0026gt;, Media Router\u003c/li\u003e\r\n\u003cli\u003eHaibin Lu \u0026lt;\u003ca href\u003d\"mailto:haibinlu@chromium.org\"\u003ehaibinlu@chromium.org\u003c/a\u003e\u0026gt;, Component extension\u003c/li\u003e\r\n\u003cli\u003eKevin Marshall \u0026lt;\u003ca href\u003d\"mailto:kmarshall@chromium.org\"\u003ekmarshall@chromium.org\u003c/a\u003e\u0026gt;, Mojo integration\u003c/li\u003e\r\n\u003cli\u003eAnton Vayvod \u0026lt;\u003ca href\u003d\"mailto:avayvod@chromium.org\"\u003eavayvod@chromium.org\u003c/a\u003e\u0026gt;, Presentation API, Chrome for Android implementation\u003c/li\u003e\r\n\u003cli\u003eYuri Wittala \u0026lt;\u003ca href\u003d\"mailto:miu@chromium.org\"\u003emiu@chromium.org\u003c/a\u003e\u0026gt;, Offscreen rendering\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Code-location\" /\u003eCode location\u003c/h2\u003e\r\n\u003cdiv\u003eThe patches to implement the Media Router have been developed in an internal repository.  They will be upstreamed into mainline Chromium with the primary code location of \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome/browser/media/router\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003efor the media router, and other components living in appropriate locations according to their type.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/media-router"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7510377848164588562"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7510377848164588562"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7510377848164588562"}],"author":[{"name":{"$t":"Mark Foltz"},"email":{"$t":"mfoltz@chromium.org"}}],"sites$pageName":{"$t":"media-router"},"sites$revision":{"$t":"57"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7686865258535119288"},"published":{"$t":"2009-06-09T22:56:20.840Z"},"updated":{"$t":"2019-07-10T08:58:51.030Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-10T08:58:48.497Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Watchlists"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis document has migrated to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/infra/watchlists.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/infra/watchlists.md\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/contributing-code/watchlists"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7686865258535119288"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7686865258535119288"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7686865258535119288"}],"author":[{}],"sites$pageName":{"$t":"watchlists"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"USl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},"published":{"$t":"2017-01-25T22:25:38.711Z"},"updated":{"$t":"2019-07-09T19:59:42.199Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-09T19:59:39.566Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Flash Usage Trends"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Volume\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eVolume\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Percent-of-Daily-Actives\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePercent of Daily Actives\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-External-Sites\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eExternal Sites\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2 style\u003d\"display:block;text-align:left\"\u003e\u003ca name\u003d\"TOC-Volume\" /\u003eVolume\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Flash%20Volume%20-%20Update%20July%209.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1562702272489/flash-roadmap/flash-usage-trends/Flash%20Volume%20-%20Update%20July%209.png\" style\u003d\"width:100%\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/h2\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eAbsolute volume of Flash Impressions (on Chrome Stable for Windows and MacOS)\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Percent-of-Daily-Actives\" /\u003ePercent of Daily Actives\u003c/h2\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003ePercent of users who have encountered at least one page w/ Flash Player content in a day (on Chrome Stable for Windows and MacOS)\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Flash%20Impact%20-%20Usage.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Flash%20Impact%20-%20Usage.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20Apr%2015.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20Aug%2010.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20July%209.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1562702316549/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20July%209.png\" style\u003d\"width:100%\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-External-Sites\" /\u003eExternal Sites\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://w3techs.com/\" rel\u003d\"nofollow\"\u003ew3techs.com\u003c/a\u003e - Flash Trends \u003ca href\u003d\"https://w3techs.com/technologies/history_overview/client_side_language/all/y\" rel\u003d\"nofollow\"\u003eYearly\u003c/a\u003e | \u003ca href\u003d\"https://w3techs.com/technologies/history_overview/client_side_language/all/q\" rel\u003d\"nofollow\"\u003eQuarterly\u003c/a\u003e | \u003ca href\u003d\"https://w3techs.com/technologies/history_overview/client_side_language/all\" rel\u003d\"nofollow\"\u003eMonthly\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/992652092463362410"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/983518581610832010"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$pageName":{"$t":"flash-usage-trends"},"sites$revision":{"$t":"28"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3699921786715907437"},"published":{"$t":"2019-07-09T19:58:36.537Z"},"updated":{"$t":"2019-07-09T19:58:36.549Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-09T19:58:36.537Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Daily Actives - Update July 9.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3699921786715907437"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20July%209.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3699921786715907437"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3699921786715907437"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3699921786715907437"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3699921786715907437"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4774157645095636972"},"published":{"$t":"2019-07-09T19:57:09.765Z"},"updated":{"$t":"2019-07-09T19:57:52.489Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-09T19:57:52.480Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Flash Volume - Update July 9.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4774157645095636972"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Flash%20Volume%20-%20Update%20July%209.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4774157645095636972"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4774157645095636972"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4774157645095636972"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4774157645095636972"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6247988065721558708"},"published":{"$t":"2014-03-25T21:59:24.844Z"},"updated":{"$t":"2019-07-09T07:09:51.681Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-09T07:09:49.254Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Setting up SSH Access to your test device."},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-In-order-to-run-the-automated-tests-against-your-device-you-need-to-ensure-it-is-running-a-Test-Image-and-you-have-password-less-SSH-Access.\" /\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003eIn order to run the automated tests against your device you need to ensure it is running a Test Image and you have password-less SSH Access.\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\r\n\u003cdiv\u003e1. First make sure you have a Chrome OS Device with a Test Image installed.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf you are a Google partner, please contact your Google representative for Google Storage access to our builds for for automated re-imaging of your test devices via the devserver (described below).\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOtherwise:\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eDownload a test image from the public waterfall \u003c/span\u003e\u003ca href\u003d\"http://build.chromium.org/p/chromiumos/waterfall\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttp://build.chromium.org/p/chromiumos/waterfall\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOr build a test image.\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Building-Chromium-OS\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttp://www.chromium.org/chromium-os/developer-guide#TOC-Building-Chromium-OS\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOnce you have a test image, install it on your test device.\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Installing-Chromium-OS-on-your-Device\"\u003ehttp://www.chromium.org/chromium-os/developer-guide#TOC-Installing-Chromium-OS-on-your-Device\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e2. Next, \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003einstall the RSA keys to allow you SSH into the device.\u003c/span\u003e\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eDownload the testing RSA keys into ~/.ssh/ (on your test server).\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eYou can get the key from the chromiumos checkout under \u003cspan style\u003d\"font-size:10pt\"\u003e\u003cb\u003e\u003ci\u003echromiumos/src/scripts/mod_for_test_scripts/ssh_keys/testing_rsa\u003c/i\u003e\u003c/b\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eOr download from \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/ssh_keys\"\u003ehttps://chromium.googlesource.com/chromiumos/chromite/+/master/ssh_keys\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eRestrict the permissions on ~/.ssh/testing_rsa; SSH will ignore the file if the permissions are too open:\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e$ chmod 0600 ~/.ssh/testing_rsa\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eAdd an entry for your device in your ~/.ssh/config:\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003eHost device\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  HostName 172.22.168.233 # The IP address of the Chrome OS Device.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  CheckHostIP no\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  StrictHostKeyChecking no\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  IdentityFile %d/.ssh/testing_rsa\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  Protocol 2\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  User root\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cul\u003e\u003cli\u003eOnce you have done both steps verify you have password less login as root:\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003ccode\u003e$ ssh device\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003eWarning: Permanently added '\u003cspan style\u003d\"font-size:13.3333px\"\u003e172.22.168.233\u003c/span\u003e' (RSA) to the list of known hosts.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003eLast login: Mon Mar 17 14:21:30 PDT 2014 from 172.18.72.8 on ssh\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003cfont color\u003d\"#ff0000\"\u003elocalhost\u003c/font\u003e ~ # \u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cul\u003e\u003cli\u003eIf connecting to multiple test devices, you can share common config options in your ~/.ssh/config:\u003c/li\u003e\u003c/ul\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238);font-size:10pt\"\u003eHost \u003c/code\u003e\u003cspan style\u003d\"background-color:rgb(238,238,238);font-size:10pt;color:rgb(0,96,0);font-family:monospace\"\u003e172.22.168.* # The subnet containing your Chrome OS test devices.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode\u003e  CheckHostIP no\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode\u003e  StrictHostKeyChecking no\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode\u003e  IdentityFile %d/.ssh/testing_rsa\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode\u003e  Protocol 2\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;line-height:normal\"\u003e\u003ccode\u003e  User root\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;line-height:normal\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003eHost device1\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;background-color:rgb(239,239,239);line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  HostName 172.22.168.233 # The IP address of the first Chrome OS Device.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003eHost device2\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;background-color:rgb(239,239,239);line-height:normal\"\u003e\u003ccode style\u003d\"background-color:rgb(238,238,238)\"\u003e  HostName 172.22.168.234 # The IP address of the second Chrome OS Device.\u003c/code\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote:\u003c/b\u003e you can also reach your device via ssh if using a Dev image, but you will need to enable the debugging features on the setup screen after a flash or powerwash.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2663446590929411560"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/ssh-test-keys-setup"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6247988065721558708"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6247988065721558708"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6247988065721558708"}],"author":[{"name":{"$t":"Simran Basi"},"email":{"$t":"sbasi@chromium.org"}}],"sites$pageName":{"$t":"ssh-test-keys-setup"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7704371346698838542"},"published":{"$t":"2014-02-05T23:26:08.097Z"},"updated":{"$t":"2019-07-08T22:55:16.042Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-08T22:55:13.886Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Reviews and Consulting"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eSo, ya need some security help? Our talents are many, but here are the things we normally assist Chromium engineers with:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eSecurity Reviews\u003c/font\u003e\u003c/b\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eFeatures that are new or substantial refactors / expansions should go through the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-reviews\"\u003eChrome Security Review\u003c/a\u003e process via the Chrome launch process. The purpose of a security review is \u003cu\u003enot\u003c/u\u003e the elimination of all possible vulnerabilities, but rather the promotion of \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/education\"\u003esecure design and implementation practices in Chromium\u003c/a\u003e. It also helps the security team stay engaged with the rest of Chromium engineering.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eAdding new code to \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent\"\u003ethird_party\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThird party code is a hot spot for security vulnerabilities, so make sure to \u003ca href\u003d\"http://www.chromium.org/developers/adding-3rd-party-libraries#TOC-Get-a-Review\"\u003egive security a head's up by getting a code review\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eOne-off questions\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eIf you are not sure what to do, or need other help, you can always just reach us at \u003ca href\u003d\"mailto:security@chromium.org\"\u003esecurity@chromium.org\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/reviews-and-consulting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7704371346698838542"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7704371346698838542"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7704371346698838542"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$pageName":{"$t":"reviews-and-consulting"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1963868707057510899"},"published":{"$t":"2019-07-04T16:20:06.620Z"},"updated":{"$t":"2019-07-04T16:29:13.157Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-04T16:20:48.301Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"June 2019, Volume II"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eJune 2019, Volume II\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eArchives: \u003c/span\u003e\u003ca href\u003d\"http://go/animations-team-highlights\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team-highlights\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:593px;height:255px\"\u003e\u003cimg height\u003d\"334.29598821989526\" src\u003d\"https://lh4.googleusercontent.com/et9ryoulZxztot-SLE6W1uC3kLdirsX9ha2wyFDxr7nGs0gAH_64JV5xiHk97i4w-urHvJpsmbzHGwdHtOgwBPdEuQTyw_nvlmguJ4eH27gSTADAB7QjeIdEjSoua_BoDKNL4uNs\" style\u003d\"margin-left:0px\" width\u003d\"593\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIs there a poltergeist trapped inside Chromium? Not any more, thanks to flackr@.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eGmail, possessed?\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA spooky bug floated our way this sprint as users began reporting that their gmail and twitter pages were \u003c/span\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d962346\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003escrolling without any user input\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e! After initial analysis from the input team (great work by bokan@!) identified it as a BlinkGenPropertyTrees-related Animations bug, Rob (flackr@) spent days teasing out first a reproduction, then a diagnosis (surprise, \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/962346\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eit was complicated\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e), and finally landing \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1256422\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ea fix\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that took care of this ghostly occurrence. Who you gonna call? Rob Flack, apparently.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"295\" /\u003e\u003ccol width\u003d\"300\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:251px;height:179px\"\u003e\u003cimg height\u003d\"179\" src\u003d\"https://lh5.googleusercontent.com/dG77X96y5b6huezy55beT998DAxMlJb5Bv_bI9d2WFqcyiJS0Fgx9K8JHcZIaRVEn-ljQusGlsLThtcV54ChP-tZx4mgIgdNmzie2pMDvcBT4fBUbzg1_zlbNfFvR9Ev5ywFVVXm\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"251\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet - it's (more) official!\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet took not one, but two big steps forward this sprint. We sent our official \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/aRKT0BkrF-8/discussion\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIntent to Ship\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to blink-dev@, reflecting our opinion that the first version of Animation Worklet has reached maturity and is ready for real users. Coincidentally - and nearly simultaneously - the spec was also \u003c/span\u003e\u003ca href\u003d\"https://www.w3.org/blog/news/archives/7830\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epromoted to First Public Working Draft\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e during this sprint.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCongrats to all the people who have and continue to work on Animation Worklet!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:277px;height:179px\"\u003e\u003cimg height\u003d\"179\" src\u003d\"https://lh4.googleusercontent.com/6640vwTykAzTgcwoKk0u4ZqXpZioR6PYeo48yUPWIb9S4jaLgOc-kfxXGrGvTscFRVW51tJVpdt0bUiD0VhYZhhNbRrEhgiAZC2vrT6-uZgjHVaPDIeUpOAHAd9Shz8Jknd38Xef\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"277\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eScrollTimeline prototype lands\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBrowser support for scroll-linked animations is a common request from web developers, as JS based solutions suffer badly when the page janks. We took one step closer to fulfilling such requests this sprint with Olga (\u003c/span\u003e\u003ca href\u003d\"mailto:gerchiko@microsoft.com\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egerchiko@microsoft.com\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e) landing a (main-thread only) prototype of \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1597286\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eScrollTimeline for Web Animations\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eInterested developers can now run Chrome with \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Montserrat,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e--enable-blink-features\u003dScrollTimeline\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to play with the prototype - but be warned, this is still very early stage!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:164px\"\u003e\u003cimg height\u003d\"164\" src\u003d\"https://lh3.googleusercontent.com/RSKmCRIPTTUphzkYEdus7axPNzy7YgZaToyRaJ2gSvyS4RECsUSwcBvKOqXBxHJ63uoZFLFCJOAzm2lEq5KBKmVo8vL5Qs149NrizzxlPxqY-Xx5ZC4_IpTwwBEQ7eBnm_hvTEXu\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:6pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eExploring the Animations space\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIt can be easy when working in the browser space to lose sight of what our corner of the web platform is actually like for web developers. This sprint Gene (girard@) put together and published \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1hPfNx9aM7KHRO7DZDTvrBAQUbTdYIap9U__uqp_-EQo/edit?usp\u003dsharing\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ean overview\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e of the tools and processes web developers are using to create and deliver animations on the web. This form of insight is vital to better understand what features we should be prioritizing, and to deliver a better web for everyone.\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(Chart above uses data originally from \u003c/span\u003e\u003ca href\u003d\"https://trends.builtwith.com/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://trends.builtwith.com\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.)\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:173px\"\u003e\u003cimg height\u003d\"173\" src\u003d\"https://lh6.googleusercontent.com/8HBpbkDCHE7aPyKADf56885lm6O9DjjjxZ4PEpqWoW2oc0n89WUMnJK6ySLkUMH7afHHKB5U7CP-fggLDrFcHD0uYKOHTZbb3JPk8gha16UvPrpMQVp-2HWvkb7eHNt6I2ImCoX8\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ePaintWorklet HiDPI bug squashing\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen developing his PaintWorklet-based Lottie renderer \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/june-2019\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003elast sprint\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, Rob discovered a few rendering bugs relating to PaintWorklet on Mac HiDPI devices - such as the unexpectedly cropped image above. Thankfully such bugs are no more, as Xida (xidachen@) spent time this sprint hunting down multiple zoom and HiDPI related PaintWorklet bugs and fixing them.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:418px;height:413px\"\u003e\u003cimg height\u003d\"413\" src\u003d\"https://lh4.googleusercontent.com/5698PMmqluSrFNc6Ejfmw43rLCwUvxnbGistZt8RddT1RsxFRiHQdBm5P2RbliVc3cr77vgp0PS8Vou8XaLGFmLd4MsBQn5pJbKstBDX4u3o-T58FCv5_mmwOgk3pdAFTitVJODA\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"418\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you understand this? Yeah, me neither. But kevers@ does!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBetter Beziers\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSometimes, you just have to get down into the weeds to improve browser interop. This sprint Kevin (kevers@) did exactly that as he tackled the hairy problem of bezier curves - namely, why does Chromium's implementation produce different values than other browsers? Details of Kevin's explorations could probably fill a small maths textbook, but in the end he was able to \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1643973\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eland a new approach for Bezier estimation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that took half the time of the old method, made Chromium pass almost 20 previously-failing WPT tests, fix two Chrome bugs (issues \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/591607\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e591607\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/827560\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e827560\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e), and exposed a \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/4046\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehole in the spec\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. We think Monsieur Bézier would have been proud. \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | June 2019, Volume II\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/june-2019-volume-ii"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1963868707057510899"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1963868707057510899"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1963868707057510899"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"june-2019-volume-ii"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"Xyl7JmA6\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3943503039573752869"},"published":{"$t":"2013-04-05T21:43:53.604Z"},"updated":{"$t":"2019-07-03T13:49:00.331Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-03T13:48:57.413Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Blink Coding Style Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003eThese guidelines are specific to the \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/blink\" style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003eBlink\u003c/a\u003e\u003cspan style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003e project, not to be confused with the general \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/styleguide.md\" style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003eChromium coding style\u003c/a\u003e\u003cspan style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003e.\u003c/span\u003e\u003c/font\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-2\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-C-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eC++\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Python\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePython\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Web-tests\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWeb tests\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-License\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eLicense\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-License-for-this-document\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eLicense for this document\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-References\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eReferences\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-C-\" /\u003eC++\u003c/h2\u003e\r\n\u003cdiv\u003eThis documentation has moved to the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/blink-c++.md\"\u003eBlink C++ Style Guide\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Python\" /\u003ePython\u003c/h2\u003e\u003cdiv\u003eThis documentation has moved to the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/python/blink-python.md\"\u003eBlink Python Style Guide\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Web-tests\" /\u003eWeb tests\u003c/h2\u003e\r\n\u003cdiv\u003eSee \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/writing_web_tests.md\" target\u003d\"_blank\"\u003eWriting Web Tests\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-License\" /\u003eLicense\u003c/h2\u003e\r\n\u003cdiv\u003eExisting files in Blink use a longer header license block inherited from WebKit, however n\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eew files should follow the \u003c/span\u003eChromium \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/c++.md#File-headers\"\u003eFile Header Style\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eTo use this license block you must make sure you have completed the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/contributing-code/external-contributor-checklist\"\u003eExternal Contributor Checklist\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-License-for-this-document\" /\u003eLicense for this document\u003c/h2\u003e\r\n\u003cdiv\u003e\u003ci style\u003d\"font-size:10pt\"\u003eThis page began as the \u003ca href\u003d\"http://www.webkit.org/coding/coding-style.html\" rel\u003d\"nofollow\"\u003eWebKit Coding Style Guidelines\u003c/a\u003e, Licensed\u003c/i\u003e\u003ci style\u003d\"font-size:10pt\"\u003e under \u003ca href\u003d\"http://www.webkit.org/coding/bsd-license.html\" rel\u003d\"nofollow\"\u003eBSD\u003c/a\u003e:\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\nBSD License\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nCopyright (C) 2009 Apple Inc. All rights reserved.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nTHIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \u003cbr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-References\" /\u003eReferences\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e[1] Comments on comments \u003ca href\u003d\"https://lists.webkit.org/pipermail/webkit-dev/2011-January/015769.html\" style\u003d\"font-size:10pt\" rel\u003d\"nofollow\"\u003ehttps://lists.webkit.org/pipermail/webkit-dev/2011-January/015769.html\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2023764670965291136"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/coding-style"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3943503039573752869"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3943503039573752869"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3943503039573752869"}],"author":[{}],"sites$pageName":{"$t":"coding-style"},"sites$revision":{"$t":"66"}},{"gd$etag":"\"WSl7JmA0\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8564516494143159754"},"published":{"$t":"2011-02-25T12:23:22.000Z"},"updated":{"$t":"2019-07-02T06:42:04.113Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-07-02T06:42:00.075Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Gerrit credentials setup (for Chromium OS and Chrome OS)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-EVERYONE-To-get-access-to-the-Chromium-Gerrit-instance\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003e(EVERYONE) To get access to the Chromium Gerrit instance\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Googlers-Partners-To-get-access-to-the-internal-Chrome-Gerrit-instance\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003e(Googlers \u0026amp; Partners) To get access to the internal Chrome Gerrit instance\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Googler-Link-chromium.org-google.com-accounts\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003e(Googler) Link @chromium.org \u0026amp; @google.com accounts\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-Gerrit\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eUsing Gerrit\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-More-Gerrit-Tips\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eMore Gerrit Tips\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eWe have two gerrit instances: Chromium OS and the (internal) Chrome OS gerrit instance.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor the Chromium OS instance: This is where most of the development happens. You do not have to be an \"official\" Chromium contributor or Googler or anything else to interact with the Chromium OS gerrit instance and/or upload changes to it.  We restrict access by only allowing certain people to \u003c/span\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt\"\u003eapprove\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e changes before they're allowed to go into the main tree.  \u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor the internal Chrome OS instance: Access is restricted to Googlers and partners with a '\u0026lt;partner\u0026gt;.corp-partner.google.com' email address.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003eThe gerrit instance for Chromium OS and Chrome OS uses Google Accounts to provide authentication. This means any account you can use to log into google.com can also be used to authenticate with Gerrit.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-EVERYONE-To-get-access-to-the-Chromium-Gerrit-instance\" /\u003e(EVERYONE) To get access to the Chromium Gerrit instance\u003c/h3\u003e\r\n\u003cp\u003eFollow the steps in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gerrit-guide\"\u003eChromium's Gerrit Guide\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Googlers-Partners-To-get-access-to-the-internal-Chrome-Gerrit-instance\" /\u003e(Googlers \u0026amp; Partners) To get access to the internal Chrome Gerrit instance\u003c/h3\u003e\r\n\u003col\u003e\u003cli\u003e(Googlers only) You must also do the steps above for your @chromium account first\u003c/li\u003e\r\n\u003cli\u003eGo to \u003ca href\u003d\"http://google.com/\"\u003ehttp://google.com/\u003c/a\u003e and verify you are logged into your @google.com account\u003c/li\u003e\r\n\u003cli\u003e\u003cspan\u003eIn the same window and session, load \u003c/span\u003e\u003ca href\u003d\"https://chrome-internal-review.googlesource.com/new-password\" target\u003d\"_blank\"\u003ehttps://chrome-internal-review.googlesource.com/new-password\u003c/a\u003e\u003c/li\u003e\r\n\u003col\u003e\u003cli\u003e\u003cb style\u003d\"color:red\"\u003eMake sure you are logged into your @google.com account. \u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb style\u003d\"color:red\"\u003eYou can verify this by ensuring that the Username field looks like git-\u0026lt;user\u0026gt;.google.com\u003c/b\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cli\u003eFollow the directions on the new-password page to append to your .gitcookies file.\u003cspan style\u003d\"font-size:13.3333330154419px\"\u003e You should click the radio button labeled \"only chrome-internal.googlesource.com\" if it exists.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eVerification: \u003c/b\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003eGooglers - \u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eRun \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003egit ls-remote https://chrome-internal.googlesource.com/chromeos/manifest-internal.git\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003ePartners - \u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFind a repo in your local manifest and run\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003egit ls-remote https://chrome-internal.googlesource.com/\u0026lt;REPO_PATH\u0026gt;.git \u003cfont color\u003d\"#000000\"\u003e- Example: \u003c/font\u003egit ls-remote https://chrome-internal.googlesource.com/chromeos/overlays/chromeos-partner-overlay.git\u003c/code\u003e\u003c/li\u003e\u003cli\u003eNote that This should \u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003enot \u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eprompt for any credentials, and should just print out a list of git references.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/ol\u003e\r\n\u003col\u003e\r\n\u003col\u003e\r\n\u003c/ol\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Googler-Link-chromium.org-google.com-accounts\" /\u003e(Googler) Link @chromium.org \u0026amp; @google.com accounts\u003c/h3\u003e\r\n\u003cp\u003eFollow the steps in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gerrit-guide\"\u003eChromium's Gerrit Guide\u003c/a\u003e. You must link your accounts to have proper access in Gerrit.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Using-Gerrit\" /\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eUsing Gerrit\u003c/b\u003e\u003c/font\u003e\u003c/h2\u003e\r\n\u003cp\u003eCheck out the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/contributing.md\"\u003eContributing Guide\u003c/a\u003e for using Gerrit and getting through the Chromium OS review process.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-More-Gerrit-Tips\" /\u003eMore Gerrit Tips\u003c/h2\u003e\r\n\u003cp\u003eCheck out the random tips in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gerrit-guide\"\u003eChromium's Gerrit Guide\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2820759774765985493"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide/gerrit-guide"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8564516494143159754"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/885290312954079854/1"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8564516494143159754"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8564516494143159754"}],"author":[{}],"sites$pageName":{"$t":"gerrit-guide"},"sites$revision":{"$t":"80"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4251162245893453949"},"published":{"$t":"2019-06-25T12:20:42.913Z"},"updated":{"$t":"2019-06-25T12:22:01.451Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-25T12:21:58.141Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Atomic Policy Groups"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ca name\u003d\"top\" /\u003e\u003cbr /\u003e\u003cp\u003eBoth Chromium and Google Chrome have some groups of policies that depend on each other to provide control over a feature. These sets are represented by the following policy groups. Given that policies can have multiple sources, only values coming from the highest priority source will be applied. Values coming from a lower priority source in the same group will be ignored. The order of priority is defined in \u003ca href\u003d\"https://support.google.com/chrome/a/?p\u003dpolicy_order\"\u003ehttps://support.google.com/chrome/a/?p\u003dpolicy_order\u003c/a\u003e.\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ctable style\u003d\"border-style:none;border-collapse:collapse\"\u003e\u003cthead\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;font-weight:bold\"\u003ePolicy Name\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%;font-weight:bold\"\u003eDescription\u003c/td\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ActiveDirectoryManagement\"\u003eActiveDirectoryManagement\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eMicrosoft® Active Directory® management settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceMachinePasswordChangeRate\"\u003eDeviceMachinePasswordChangeRate\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eMachine password change rate\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceUserPolicyLoopbackProcessingMode\"\u003eDeviceUserPolicyLoopbackProcessingMode\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eUser policy loopback processing mode\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceKerberosEncryptionTypes\"\u003eDeviceKerberosEncryptionTypes\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllowed Kerberos encryption types\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceGpoCacheLifetime\"\u003eDeviceGpoCacheLifetime\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eGPO cache lifetime\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceAuthDataCacheLifetime\"\u003eDeviceAuthDataCacheLifetime\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAuthentication data cache lifetime\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Attestation\"\u003eAttestation\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAttestation\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AttestationEnabledForDevice\"\u003eAttestationEnabledForDevice\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable remote attestation for the device\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AttestationEnabledForUser\"\u003eAttestationEnabledForUser\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable remote attestation for the user\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AttestationExtensionWhitelist\"\u003eAttestationExtensionWhitelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eExtensions allowed to to use the remote attestation API\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AttestationForContentProtectionEnabled\"\u003eAttestationForContentProtectionEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable the use of remote attestation for content protection for the device\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcher\"\u003eBrowserSwitcher\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eLegacy Browser Support\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AlternativeBrowserPath\"\u003eAlternativeBrowserPath\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAlternative browser to launch for configured websites.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#AlternativeBrowserParameters\"\u003eAlternativeBrowserParameters\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eCommand-line parameters for the alternative browser.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherChromePath\"\u003eBrowserSwitcherChromePath\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePath to Chrome for switching from the alternative browser.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherChromeParameters\"\u003eBrowserSwitcherChromeParameters\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eCommand-line parameters for switching from the alternative browser.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherDelay\"\u003eBrowserSwitcherDelay\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDelay before launching alternative browser (milliseconds)\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherEnabled\"\u003eBrowserSwitcherEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable the Legacy Browser Support feature.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherExternalSitelistUrl\"\u003eBrowserSwitcherExternalSitelistUrl\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURL of an XML file that contains URLs to load in an alternative browser.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherExternalGreylistUrl\"\u003eBrowserSwitcherExternalGreylistUrl\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURL of an XML file that contains URLs that should never trigger a browser switch.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherKeepLastChromeTab\"\u003eBrowserSwitcherKeepLastChromeTab\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eKeep last tab open in Chrome.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherUrlList\"\u003eBrowserSwitcherUrlList\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eWebsites to open in alternative browser\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherUrlGreylist\"\u003eBrowserSwitcherUrlGreylist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eWebsites that should never trigger a browser switch.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#BrowserSwitcherUseIeSitelist\"\u003eBrowserSwitcherUseIeSitelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eUse Internet Explorer's SiteList policy for Legacy Browser Support.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ChromeReportingExtension\"\u003eChromeReportingExtension\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eChrome Reporting Extension\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportVersionData\"\u003eReportVersionData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport OS and Chromium Version Information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportPolicyData\"\u003eReportPolicyData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport Chromium Policy Information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportMachineIDData\"\u003eReportMachineIDData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport Machine Identification information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportUserIDData\"\u003eReportUserIDData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport User Identification information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportExtensionsAndPluginsData\"\u003eReportExtensionsAndPluginsData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport Extensions and Plugins information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportSafeBrowsingData\"\u003eReportSafeBrowsingData\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport Safe Browsing information\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CloudReportingEnabled\"\u003eCloudReportingEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnables Chromium cloud reporting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ContentPack\"\u003eContentPack\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eContent pack\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ContentPackDefaultFilteringBehavior\"\u003eContentPackDefaultFilteringBehavior\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault behavior for sites not in any content pack\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ContentPackManualBehaviorHosts\"\u003eContentPackManualBehaviorHosts\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eManaged user manual exception hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ContentPackManualBehaviorURLs\"\u003eContentPackManualBehaviorURLs\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eManaged user manual exception URLs\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CookiesSettings\"\u003eCookiesSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eCookies settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultCookiesSetting\"\u003eDefaultCookiesSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault cookies setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CookiesAllowedForUrls\"\u003eCookiesAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow cookies on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CookiesBlockedForUrls\"\u003eCookiesBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock cookies on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CookiesSessionOnlyForUrls\"\u003eCookiesSessionOnlyForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eLimit cookies from matching URLs to the current session\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DateAndTime\"\u003eDateAndTime\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDate and time\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SystemTimezone\"\u003eSystemTimezone\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eTimezone\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SystemTimezoneAutomaticDetection\"\u003eSystemTimezoneAutomaticDetection\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the automatic timezone detection method\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProvider\"\u003eDefaultSearchProvider\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderEnabled\"\u003eDefaultSearchProviderEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable the default search provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderName\"\u003eDefaultSearchProviderName\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider name\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderKeyword\"\u003eDefaultSearchProviderKeyword\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider keyword\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderSearchURL\"\u003eDefaultSearchProviderSearchURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider search URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderSuggestURL\"\u003eDefaultSearchProviderSuggestURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider suggest URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderInstantURL\"\u003eDefaultSearchProviderInstantURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider instant URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderIconURL\"\u003eDefaultSearchProviderIconURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider icon\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderEncodings\"\u003eDefaultSearchProviderEncodings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider encodings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderAlternateURLs\"\u003eDefaultSearchProviderAlternateURLs\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eList of alternate URLs for the default search provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderSearchTermsReplacementKey\"\u003eDefaultSearchProviderSearchTermsReplacementKey\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameter controlling search term placement for the default search provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderImageURL\"\u003eDefaultSearchProviderImageURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameter providing search-by-image feature for the default search provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderNewTabURL\"\u003eDefaultSearchProviderNewTabURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault search provider new tab page URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderSearchURLPostParams\"\u003eDefaultSearchProviderSearchURLPostParams\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameters for search URL which uses POST\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderSuggestURLPostParams\"\u003eDefaultSearchProviderSuggestURLPostParams\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameters for suggest URL which uses POST\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderInstantURLPostParams\"\u003eDefaultSearchProviderInstantURLPostParams\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameters for instant URL which uses POST\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultSearchProviderImageURLPostParams\"\u003eDefaultSearchProviderImageURLPostParams\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eParameters for image URL which uses POST\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Display\"\u003eDisplay\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDisplay\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceDisplayResolution\"\u003eDeviceDisplayResolution\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSet display resolution and scale factor\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DisplayRotationDefault\"\u003eDisplayRotationDefault\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSet default display rotation, reapplied on every reboot\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Drive\"\u003eDrive\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDrive\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DriveDisabled\"\u003eDriveDisabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDisable Drive in the Chromium OS Files app\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DriveDisabledOverCellular\"\u003eDriveDisabledOverCellular\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDisable Google Drive over cellular connections in the Chromium OS Files app\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Extensions\"\u003eExtensions\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eExtensions\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionInstallBlacklist\"\u003eExtensionInstallBlacklist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure extension installation blacklist\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionInstallWhitelist\"\u003eExtensionInstallWhitelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure extension installation whitelist\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionInstallForcelist\"\u003eExtensionInstallForcelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the list of force-installed apps and extensions\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionInstallSources\"\u003eExtensionInstallSources\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure extension, app, and user script install sources\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionAllowedTypes\"\u003eExtensionAllowedTypes\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure allowed app/extension types\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionAllowInsecureUpdates\"\u003eExtensionAllowInsecureUpdates\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow insecure algorithms in integrity checks on extension updates and installs\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ExtensionSettings\"\u003eExtensionSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eExtension management settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#GoogleCast\"\u003eGoogleCast\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eGoogle Cast\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CastReceiverEnabled\"\u003eCastReceiverEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable casting content to the device\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#CastReceiverName\"\u003eCastReceiverName\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eName of the Google Cast destination\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Homepage\"\u003eHomepage\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eHomepage\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#HomepageLocation\"\u003eHomepageLocation\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the home page URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#HomepageIsNewTabPage\"\u003eHomepageIsNewTabPage\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eUse New Tab Page as homepage\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NewTabPageLocation\"\u003eNewTabPageLocation\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the New Tab page URL\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ShowHomeButton\"\u003eShowHomeButton\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eShow Home button on toolbar\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ImageSettings\"\u003eImageSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eImage settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultImagesSetting\"\u003eDefaultImagesSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault images setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ImagesAllowedForUrls\"\u003eImagesAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow images on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ImagesBlockedForUrls\"\u003eImagesBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock images on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#JavascriptSettings\"\u003eJavascriptSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eJavascript settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultJavaScriptSetting\"\u003eDefaultJavaScriptSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault JavaScript setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#JavaScriptAllowedForUrls\"\u003eJavaScriptAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow JavaScript on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#JavaScriptBlockedForUrls\"\u003eJavaScriptBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock JavaScript on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#KeygenSettings\"\u003eKeygenSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eKeygen settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultKeygenSetting\"\u003eDefaultKeygenSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault key generation setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#KeygenAllowedForUrls\"\u003eKeygenAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow key generation on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#KeygenBlockedForUrls\"\u003eKeygenBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock key generation on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Kiosk\"\u003eKiosk\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eKiosk settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLocalAccounts\"\u003eDeviceLocalAccounts\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDevice-local accounts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLocalAccountAutoLoginId\"\u003eDeviceLocalAccountAutoLoginId\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDevice-local account for auto-login\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLocalAccountAutoLoginDelay\"\u003eDeviceLocalAccountAutoLoginDelay\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDevice-local account auto-login timer\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLocalAccountAutoLoginBailoutEnabled\"\u003eDeviceLocalAccountAutoLoginBailoutEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable bailout keyboard shortcut for auto-login\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLocalAccountPromptForNetworkWhenOffline\"\u003eDeviceLocalAccountPromptForNetworkWhenOffline\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable network configuration prompt when offline\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#LoginScreenOrigins\"\u003eLoginScreenOrigins\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eLogin and screen origins\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLoginScreenIsolateOrigins\"\u003eDeviceLoginScreenIsolateOrigins\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable Site Isolation for specified origins\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceLoginScreenSitePerProcess\"\u003eDeviceLoginScreenSitePerProcess\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable Site Isolation for every site\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NativeMessaging\"\u003eNativeMessaging\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eNative messaging\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NativeMessagingBlacklist\"\u003eNativeMessagingBlacklist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure native messaging blacklist\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NativeMessagingWhitelist\"\u003eNativeMessagingWhitelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure native messaging whitelist\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NativeMessagingUserLevelHosts\"\u003eNativeMessagingUserLevelHosts\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow user-level Native Messaging hosts (installed without admin permissions)\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NetworkFileShares\"\u003eNetworkFileShares\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eNetwork File Shares settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NetworkFileSharesAllowed\"\u003eNetworkFileSharesAllowed\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eContorls Network File Shares for ChromeOS availability\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NetBiosShareDiscoveryEnabled\"\u003eNetBiosShareDiscoveryEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eControls Network File Share discovery via NetBIOS\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NTLMShareAuthenticationEnabled\"\u003eNTLMShareAuthenticationEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eControls enabling NTLM as an authentication protocol for SMB mounts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NetworkFileSharesPreconfiguredShares\"\u003eNetworkFileSharesPreconfiguredShares\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eList of preconfigured network file shares.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NotificationsSettings\"\u003eNotificationsSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eNotification settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultNotificationsSetting\"\u003eDefaultNotificationsSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault notification setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NotificationsAllowedForUrls\"\u003eNotificationsAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow notifications on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#NotificationsBlockedForUrls\"\u003eNotificationsBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock notifications on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordManager\"\u003ePasswordManager\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePassword manager\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordManagerEnabled\"\u003ePasswordManagerEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable saving passwords to the password manager\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordManagerAllowShowPasswords\"\u003ePasswordManagerAllowShowPasswords\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow users to show passwords in Password Manager (deprecated)\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordProtection\"\u003ePasswordProtection\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePassword protection\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordProtectionWarningTrigger\"\u003ePasswordProtectionWarningTrigger\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePassword protection warning trigger\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordProtectionLoginURLs\"\u003ePasswordProtectionLoginURLs\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the list of enterprise login URLs where password protection service should capture fingerprint of password.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PasswordProtectionChangePasswordURL\"\u003ePasswordProtectionChangePasswordURL\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the change password URL.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PinUnlock\"\u003ePinUnlock\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePin unlock\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PinUnlockMinimumLength\"\u003ePinUnlockMinimumLength\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSet the minimum length of the lock screen PIN\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PinUnlockMaximumLength\"\u003ePinUnlockMaximumLength\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSet the maximum length of the lock screen PIN\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PinUnlockWeakPinsAllowed\"\u003ePinUnlockWeakPinsAllowed\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable users to set weak PINs for the lock screen PIN\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginVm\"\u003ePluginVm\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePluginVm\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginVmAllowed\"\u003ePluginVmAllowed\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow devices to use a PluginVm on Chromium OS\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginVmLicenseKey\"\u003ePluginVmLicenseKey\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePluginVm license key\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginVmImage\"\u003ePluginVmImage\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePluginVm image\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginsSettings\"\u003ePluginsSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePlugins settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultPluginsSetting\"\u003eDefaultPluginsSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault Flash setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginsAllowedForUrls\"\u003ePluginsAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow the Flash plugin on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PluginsBlockedForUrls\"\u003ePluginsBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock the Flash plugin on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PopupsSettings\"\u003ePopupsSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePopups settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultPopupsSetting\"\u003eDefaultPopupsSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eDefault popups setting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PopupsAllowedForUrls\"\u003ePopupsAllowedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow popups on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#PopupsBlockedForUrls\"\u003ePopupsBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock popups on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#Proxy\"\u003eProxy\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eProxy\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxyMode\"\u003eProxyMode\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eChoose how to specify proxy server settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxyServerMode\"\u003eProxyServerMode\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eChoose how to specify proxy server settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxyServer\"\u003eProxyServer\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAddress or URL of proxy server\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxyPacUrl\"\u003eProxyPacUrl\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURL to a proxy .pac file\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxyBypassList\"\u003eProxyBypassList\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eProxy bypass rules\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ProxySettings\"\u003eProxySettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eProxy settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#QuickUnlock\"\u003eQuickUnlock\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eQuick unlock\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#QuickUnlockModeWhitelist\"\u003eQuickUnlockModeWhitelist\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure allowed quick unlock modes\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#QuickUnlockTimeout\"\u003eQuickUnlockTimeout\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSet how often user has to enter password to use quick unlock\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccess\"\u003eRemoteAccess\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eRemote access\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessClientFirewallTraversal\"\u003eRemoteAccessClientFirewallTraversal\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable firewall traversal from remote access client\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostClientDomain\"\u003eRemoteAccessHostClientDomain\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the required domain name for remote access clients\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostClientDomainList\"\u003eRemoteAccessHostClientDomainList\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the required domain names for remote access clients\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostFirewallTraversal\"\u003eRemoteAccessHostFirewallTraversal\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable firewall traversal from remote access host\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostDomain\"\u003eRemoteAccessHostDomain\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the required domain name for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostDomainList\"\u003eRemoteAccessHostDomainList\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the required domain names for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostRequireTwoFactor\"\u003eRemoteAccessHostRequireTwoFactor\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable two-factor authentication for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostTalkGadgetPrefix\"\u003eRemoteAccessHostTalkGadgetPrefix\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the TalkGadget prefix for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostRequireCurtain\"\u003eRemoteAccessHostRequireCurtain\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable curtaining of remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostAllowClientPairing\"\u003eRemoteAccessHostAllowClientPairing\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable or disable PIN-less authentication for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostAllowGnubbyAuth\"\u003eRemoteAccessHostAllowGnubbyAuth\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow gnubby authentication for remote access hosts\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostAllowRelayedConnection\"\u003eRemoteAccessHostAllowRelayedConnection\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable the use of relay servers by the remote access host\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostUdpPortRange\"\u003eRemoteAccessHostUdpPortRange\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eRestrict the UDP port range used by the remote access host\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostMatchUsername\"\u003eRemoteAccessHostMatchUsername\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eRequire that the name of the local user and the remote access host owner match\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostTokenUrl\"\u003eRemoteAccessHostTokenUrl\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURL where remote access clients should obtain their authentication token\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostTokenValidationUrl\"\u003eRemoteAccessHostTokenValidationUrl\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURL for validating remote access client authentication token\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostTokenValidationCertificateIssuer\"\u003eRemoteAccessHostTokenValidationCertificateIssuer\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eClient certificate for connecting to RemoteAccessHostTokenValidationUrl\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostDebugOverridePolicies\"\u003eRemoteAccessHostDebugOverridePolicies\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003ePolicy overrides for Debug builds of the remote access host\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostAllowUiAccessForRemoteAssistance\"\u003eRemoteAccessHostAllowUiAccessForRemoteAssistance\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow remote users to interact with elevated windows in remote assistance sessions\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RemoteAccessHostAllowFileTransfer\"\u003eRemoteAccessHostAllowFileTransfer\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow remote access users to transfer files to/from the host\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RestoreOnStartup\"\u003eRestoreOnStartup\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAction on startup\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RestoreOnStartup\"\u003eRestoreOnStartup\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAction on startup\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#RestoreOnStartupURLs\"\u003eRestoreOnStartupURLs\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eURLs to open on startup\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SAML\"\u003eSAML\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSAML\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceSamlLoginAuthenticationType\"\u003eDeviceSamlLoginAuthenticationType\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSAML login authentication type\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceTransferSAMLCookies\"\u003eDeviceTransferSAMLCookies\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eTransfer SAML IdP cookies during login\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SafeBrowsing\"\u003eSafeBrowsing\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSafe Browsing settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SafeBrowsingEnabled\"\u003eSafeBrowsingEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable Safe Browsing\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SafeBrowsingExtendedReportingEnabled\"\u003eSafeBrowsingExtendedReportingEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable Safe Browsing Extended Reporting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SafeBrowsingExtendedReportingOptInAllowed\"\u003eSafeBrowsingExtendedReportingOptInAllowed\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow users to opt in to Safe Browsing extended reporting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SafeBrowsingWhitelistDomains\"\u003eSafeBrowsingWhitelistDomains\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eConfigure the list of domains on which Safe Browsing will not trigger warnings.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SupervisedUsers\"\u003eSupervisedUsers\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSupervised users\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SupervisedUsersEnabled\"\u003eSupervisedUsersEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable supervised users\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SupervisedUserCreationEnabled\"\u003eSupervisedUserCreationEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable creation of supervised users\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#SupervisedUserContentProviderEnabled\"\u003eSupervisedUserContentProviderEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable the supervised user content provider\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#UserAndDeviceReporting\"\u003eUserAndDeviceReporting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eUser and device reporting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceVersionInfo\"\u003eReportDeviceVersionInfo\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport OS and firmware version\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceBootMode\"\u003eReportDeviceBootMode\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport device boot mode\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceUsers\"\u003eReportDeviceUsers\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport device users\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceActivityTimes\"\u003eReportDeviceActivityTimes\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport device activity times\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceLocation\"\u003eReportDeviceLocation\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport device location\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceNetworkInterfaces\"\u003eReportDeviceNetworkInterfaces\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport device network interfaces\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceHardwareStatus\"\u003eReportDeviceHardwareStatus\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport hardware status\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceSessionStatus\"\u003eReportDeviceSessionStatus\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport information about active kiosk sessions\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceBoardStatus\"\u003eReportDeviceBoardStatus\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport board status\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDevicePowerStatus\"\u003eReportDevicePowerStatus\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport power status\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportDeviceStorageStatus\"\u003eReportDeviceStorageStatus\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport storage status\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportUploadFrequency\"\u003eReportUploadFrequency\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eFrequency of device status report uploads\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#ReportArcStatusEnabled\"\u003eReportArcStatusEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eReport information about status of Android\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#HeartbeatEnabled\"\u003eHeartbeatEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSend network packets to the management server to monitor online status\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#HeartbeatFrequency\"\u003eHeartbeatFrequency\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eFrequency of monitoring network packets\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#LogUploadEnabled\"\u003eLogUploadEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eSend system logs to the management server\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceMetricsReportingEnabled\"\u003eDeviceMetricsReportingEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable metrics reporting\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#WebUsbSettings\"\u003eWebUsbSettings\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eWeb USB settings\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DefaultWebUsbGuardSetting\"\u003eDefaultWebUsbGuardSetting\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eControl use of the WebUSB API\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceWebUsbAllowDevicesForUrls\"\u003eDeviceWebUsbAllowDevicesForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAutomatically grant permission to these sites to connect to USB devices with the given vendor and product IDs.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#WebUsbAllowDevicesForUrls\"\u003eWebUsbAllowDevicesForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAutomatically grant permission to these sites to connect to USB devices with the given vendor and product IDs.\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#WebUsbAskForUrls\"\u003eWebUsbAskForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eAllow WebUSB on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#WebUsbBlockedForUrls\"\u003eWebUsbBlockedForUrls\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eBlock WebUSB on these sites\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:7px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#WiFi\"\u003eWiFi\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eWiFi\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceWiFiFastTransitionEnabled\"\u003eDeviceWiFiFastTransitionEnabled\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable 802.11r Fast Transition\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:200px;padding-left:21px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3#DeviceWiFiAllowed\"\u003eDeviceWiFiAllowed\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;vertical-align:top;width:236px;height:15px;width:100%\"\u003eEnable WiFi\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/571294686393045326"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3/atomic_groups"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4251162245893453949"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4251162245893453949"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4251162245893453949"}],"author":[{"name":{"$t":"Julian Pastarmov"},"email":{"$t":"pastarmovj@chromium.org"}}],"sites$pageName":{"$t":"atomic_groups"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3774455812464795984"},"published":{"$t":"2018-08-13T19:26:16.531Z"},"updated":{"$t":"2019-06-24T09:24:15.457Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-24T09:23:57.021Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome OS Security Advisories"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe following is a list of security advisory pages published on \u003c/span\u003e\u003ca href\u003d\"https://www.chromium.org\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://www.chromium.org\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNote that we do not routinely publish information for all fixed vulnerabilities on a dedicated page, just for vulnerabilities where users/customers will benefit from a more in-depth description of the issue and/or where mitigative action by the user is necessary. Thus, the majority of security bug fixes will not be listed here but handled as \u003c/span\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d1\u0026amp;q\u003dType%3DBug-Security+OS%3DChrome\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esecurity bugs in the bugs.chromium.org tracker\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and the fixes will be rolled out transparently to devices with the Chrome OS auto-update mechanism.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eList of advisories in reverse chronological order:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:justify\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/u2f-ecdsa-vulnerability\"\u003eU2F ECDSA vulnerability\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:justify\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:14.6667px;white-space:pre\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/mds-on-chromeos\"\u003eMicroarchitectural Data Sampling on Chrome OS\u003c/a\u003e \r\n\u003c/span\u003e\u003c/font\u003e\r\n\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/unchecked_tpm_reset\"\u003ePrivilege escalation via unchecked TPM reset\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:justify\"\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/lazy-fp-restore-vulnerability-status\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLazy FP Restore Vulnerability Status for Chrome OS\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/meltdown-spectre-vulnerability-status\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMeltdown/Spectre vulnerability status for Chrome OS devices\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/meltdown-spectre-vulnerability-status\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTrusted Platform Module firmware vulnerability\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/security-advisories"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3774455812464795984"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3774455812464795984"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3774455812464795984"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$pageName":{"$t":"security-advisories"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2492097714142117018"},"published":{"$t":"2013-05-15T04:07:18.332Z"},"updated":{"$t":"2019-06-20T22:58:57.778Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-20T22:58:55.570Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome Frame Viewer Overview and Getting Started"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe frame viewer is a feature in Chrome's about:tracing for studying difficult rendering performance problems.\u003cdiv\u003e\u003cdiv style\u003d\"display:block;margin-top:5px;margin-right:auto;margin-bottom:0px;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/frame-viewer/frameviewer.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"269\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1369783402629/developers/how-tos/trace-event-profiling-tool/frame-viewer/frameviewer.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Getting-started\" /\u003eGetting started\u003c/h2\u003e\u003cdiv\u003eFrame viewer is best used in Chrome Canary\u003cspan style\u003d\"font-size:10pt\"\u003e, but viewing traces requires that you launch with special flags. On OSX, the appropriate incantation is:\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\" size\u003d\"1\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e/Applications/Google\\ Chrome\\ Canary.app/Contents/MacOS/Google\\ Chrome\\ Canary --enable-skia-benchmarking\u003c/font\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen you have such a build:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eGo to about:tracing and press record\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eCheck the \u003cb\u003eFrame Viewer\u003c/b\u003e option.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ePress \u003cb\u003eRecord\u003c/b\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eGo to some other tab, refresh, then do the janky action.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eGo back to tracing and press stop.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eScroll through the tracks (using W, A, S, and D) looking for the \"cc::LayerTreehostImpl\" track. Click a dot on that track and you will get a viewer for that frame.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Reporting-Rendering-Performance-Bugs\" /\u003e\u003cfont size\u003d\"4\"\u003eReporting Rendering Performance Bugs\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-The-best-performance-bug-reports-come-with-two-traces:-one-taken-with-frame-viewer-on-and-one-taken-with-frame-viewer-off.-We-use-both-because-frame-viewer-while-fast-is-still-intrusive-to-total-performance.-To-do-this:\" /\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent;font-weight:normal\"\u003eThe best performance bug reports come with two traces: one taken with frame viewer on, and one taken with frame viewer off. We use both because frame viewer, while fast, is still intrusive to total performance. To do this:\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eStart up chrome with the frame viewer command line, above.\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent\"\u003eRecord a trace of your slow action, with \u003c/span\u003e\u003cb style\u003d\"font-size:small;background-color:transparent\"\u003ecc.debug \u003c/b\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent\"\u003eand \u003c/span\u003e\u003cb style\u003d\"font-size:small;background-color:transparent\"\u003ecc.debug.display_items \u003c/b\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent\"\u003e\u003cu\u003eunchecked\u003c/u\u003e. This is your true performance trace. We will use that to understand whether the performance issue is functional [requiring the frame viewer data] or raw performance related [requiring just the performance data]\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eWithout rebooting chrome or changing its command line, record a second trace, now with \u003cb\u003ecc.debug \u003c/b\u003eand \u003cb\u003ecc.debug.\u003cb style\u003d\"background-color:transparent\"\u003edisplay_items\u003c/b\u003e \u003c/b\u003e\u003cu\u003echecked\u003c/u\u003e. This is the frame viewer trace and lets us understand functional issues in the page that may lead to performance problems.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Frame-Viewer-on-Android\" /\u003e\u003cfont size\u003d\"4\"\u003eFrame Viewer on Android\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eYou can trace a USB-connected Android device remotely from the \u003c/font\u003e\u003ci\u003e\u003cb\u003echrome://inspect/?tracing#devices\u003c/b\u003e\u003c/i\u003e URL. \u003cspan style\u003d\"font-size:small;background-color:transparent\"\u003eAlternatively, there is a command line script in the Chrome repository that provides the same functionality. For example, this command captures a 5 second trace with frame viewer data from the stable version of Chrome on an Android device:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cb\u003ebuild/android/adb_profile_chrome --browser\u003dstable --trace-frame-viewer -t 5\u003c/b\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cdiv /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-The-script-downloads-the-resulting-trace-file-to-the-current-directory.-You-can-view-it-by-opening-Chrome-on-your-desktop-going-to-about:tracing-and-clicking-on-Load-.-The-chrome-you-load-it-into-must-be-a-similar-version-of-chrome-within-2-major-versions-\" /\u003e\u003cspan style\u003d\"font-size:small;font-weight:normal\"\u003eThe script downloads the resulting trace file to the current directory. You can view it by opening Chrome on your desktop, going to about:tracing and clicking on \"Load\". The chrome you load it into must be a similar version of chrome (within ~2 major versions) of your Android build for it to load properly. The \u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003eviewing\u003cspan style\u003d\"font-weight:normal\"\u003e browser must have the \u003c/span\u003e\u003c/span\u003e\u003cb style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e--enable-skia-benchmarking\u003c/font\u003e\u003c/b\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003e flag set to see the frame images.\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Some-notes\" /\u003eSome notes\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eArrow keys move between frames, once you have selected them\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Demo-Video\" /\u003eDemo Video\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:480px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/bMZZOzuJCgk?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed\" style\u003d\"width:480px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eJSConf.Eu demo\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/8S_Vlq3jLZ0?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-More-info\" /\u003eMore info\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-For-details-on-how-it-works-see-the-design-doc.-For-more-information-you-can-join-read-the-trace-viewer-mailing-list-or-review-the-code-which-is-located-inside-https:-code.google.com-p-trace-viewer-.\" /\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal\"\u003eFor details on how it works, see the \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/chromium.org/document/d/13FAQ9ckY7RDihv6aW5ehz15Pm2aheQFR7cY6FPdBmIQ/edit#heading\u003dh.uyhrrm74z5nq\" style\u003d\"font-size:10pt;font-weight:normal\"\u003edesign doc\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal\"\u003e. For more information, you can join/read the \u003c/span\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"https://groups.google.com/forum/#!forum/trace-viewer\"\u003etrace-viewer mailing list\u003c/a\u003e, or review the code, which is located inside \u003ca href\u003d\"https://code.google.com/p/trace-viewer/\"\u003ehttps://code.google.com/p/trace-viewer/\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3702888333079561327"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/frame-viewer"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2492097714142117018"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2492097714142117018"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2492097714142117018"}],"author":[{"name":{"$t":"Nathaniel Duca"},"email":{"$t":"nduca@chromium.org"}}],"sites$pageName":{"$t":"frame-viewer"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/791820649624357045"},"published":{"$t":"2019-06-19T19:48:30.235Z"},"updated":{"$t":"2019-06-19T19:58:31.353Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-19T19:58:29.364Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"June 2019"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eJune 2019\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eArchives: \u003c/span\u003e\u003ca href\u003d\"http://go/animations-team-highlights\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team-highlights\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:593px;height:255px\"\u003e\u003cimg height\u003d\"151.34334224680958\" src\u003d\"https://lh6.googleusercontent.com/m4coonQxOBK51yMEp5SzIVklqRrtqAYwfdXWZXoXSu3aes8t_mLkYnflh0fKVs4EXQPNeRLttrdBjC8R6GcDHMlc6YwMYc1ps2eKlq6H-RAMX6-rSukfKe23fQfzux059NrGHe28\" style\u003d\"margin-left:0px;margin-top:50.861570348290286px\" width\u003d\"593\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eLottie Paint Worklet Renderer\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003ca href\u003d\"https://airbnb.design/lottie/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLottie\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is a popular framework from AirBnB that renders After Effects animations, allowing designers to create rich complex animations. Following up from the \u003c/span\u003e\u003ca href\u003d\"https://dev.chromium.org/teams/animations/highlights-archive/april-2019-volume-ii\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eprevious proof of concept\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, Rob (flackr@) \u003c/span\u003e\u003ca href\u003d\"https://github.com/flackr/lottie-web/tree/paint-worklet\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecreated a proper renderer\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e preparing to send a PR to land the code upstream. The \u003c/span\u003e\u003ca href\u003d\"https://twitter.com/flackrw/status/1135714462546182144\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eresponse on twitter has been very positive\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and with the demo \u003c/span\u003e\u003ca href\u003d\"https://flackr.github.io/lottie-web/demo/bodymovin/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epublicly accessible\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e we have seen an \u003c/span\u003e\u003ca href\u003d\"https://chromestatus.com/metrics/feature/timeline/popularity/2385\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eincrease in the usage of Paint Worklet\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:612pt;table-layout:fixed\"\u003e\u003ccolgroup\u003e\u003ccol /\u003e\u003ccol /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:284px;height:121px\"\u003e\u003cimg height\u003d\"121\" src\u003d\"https://lh5.googleusercontent.com/bQ1CSbp3EmX4fKEjkXY1dlKZ8MRvdtfBR4eoQt57owRNba-xw00y_2hGh90_o0LoSWECa5BT_ip3kJh0K988KWFfgKF1L_SzSQo3h-VutcgqTAY0sgFam3ndvD_OIsIf0oijOywi\" style\u003d\"margin-left:15px;margin-top:0px\" width\u003d\"198.1957328066892\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eJump timing functions\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003ca href\u003d\"https://drafts.csswg.org/css-easing-1/#step-easing-functions\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eJump timing functions\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e allow developers to choose the starting / ending behavior of the steps timing function. Thanks to Kevin’s (kevers@) \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1634722\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehard work\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e chromium has \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/?utm_medium\u003demail\u0026amp;utm_source\u003dfooter#!msg/blink-dev/u65DesVOzmY/htUnPfFcBgAJ\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eshipped these functions in M77\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e!\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:121px\"\u003e\u003cimg height\u003d\"121\" src\u003d\"https://lh5.googleusercontent.com/BHmrokKErIb7eNeCsjGw4Ae6c-PDYX3YCjfB8ENHs70ELIQLDuL2nwSOza0XygjTYFQ5ZMKh8vmY11gBqmRZRv9FBbrh0aOmzD3dZcAhkIS9yYNZStUQle-EIFrjIKbhBM1x06eN\" style\u003d\"margin-top:0px\" width\u003d\"291.65571205007825\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eScroll snap … stop!\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA common use case for scroll snap is a paginated UI. Often, developers want users to be able to easily swipe to the next page. Thanks to Majid’s (majidvp@) efforts scroll snap stop has now \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/blink-dev/bkUwigYHJDM/Bzvm8tkHAgAJ\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eofficially shipped\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in \u003c/span\u003e\u003ca href\u003d\"https://www.chromestatus.com/features/5439846480871424\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eM75\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eand used by \u003c/span\u003e\u003ca href\u003d\"https://drive.google.com/file/d/1D-xXO6wstu0HJJXvvwFjNpa2R1gzwuhG/view?usp\u003dsharing\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAirBnb\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eHoudini Face-to-face\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMajid and Rob attended the \u003c/span\u003e\u003ca href\u003d\"https://wiki.csswg.org/planning/toronto-2019\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCSS working group\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to advance \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/wiki/Toronto-F2F-June-2019\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eseveral Houdini spec issues\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Notable topics discussed include: \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/issues/869\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStyleMaps for Animation Worklet\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/issues/877\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecycle detection for Paint Worklet\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/issues/872\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echeaply passing large data in the typed OM\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eOff-thread Paint Worklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSupport for running paint worklet is steadily approaching completion with Stephen (smcgruer@) adding \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1639079\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003easynchronous paint dispatch\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, Xida (xidachen@) is designing \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1a7gO6cBxsJhn53akuJuieUiXvB74vvEmFDyKww8NKdw/edit\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eanimation integration\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and Adam (asraine@) \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/948761\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eadded fallback\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for the cases we can’t support.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:121px\"\u003e\u003cimg height\u003d\"121\" src\u003d\"https://lh3.googleusercontent.com/r6Wkle2R-fnxzk4IwP-s_ssaMFE3-kmJP1FO20H9N2eJezr6Kc8yKo8JleHnY1czBkbVEhw-FKNAcb344bvyyntsfoiFH74OV5I37bmEM4wYQ1rBVHW6-zCHbPuz2DQFvJdaTr34\" style\u003d\"margin-left:47.129629629629676px\" width\u003d\"188.74074074074065\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eGroup Effects\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMajid and Yi (yigu@) have put together a new \u003c/span\u003e\u003ca href\u003d\"https://github.com/yi-gu/group_effects/blob/master/README.md\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eexplainer\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for Group Effect proposing changes to the existing draft design to make if more customizable and \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/4008\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erestarting\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the effort to standardize the feature as part of WebAnimations level 2.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:121px\"\u003e\u003cimg height\u003d\"126.00000000000023\" src\u003d\"https://lh3.googleusercontent.com/cdBRl4mdiK_TkHcothUZSYhUXGbZ-NKD13Kx3P2-tcq_VjatfaOTov0Sd5AxGzPdr0ogyHw77mNKdZqfVh6_rRlVspirZmjkwB7LFuoZVJ_gXudDAgShHBRcR_QpL6aGqZLJ7ym5\" style\u003d\"margin-left:40.360368144252334px\" width\u003d\"202.27926371149522\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBugs, bugs and less bugs\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe’ve continued our effort to stay on top of incoming animation bugs. Over the 3 week period 13 animation related bugs were closed, however 11 new ones were opened in that same time.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | June 2019\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(66,133,244);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/june-2019"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/791820649624357045"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4450355656200110026/3"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/791820649624357045"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/791820649624357045"}],"author":[{"name":{"$t":"Robert Flack"},"email":{"$t":"flackr@chromium.org"}}],"sites$pageName":{"$t":"june-2019"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4450355656200110026"},"published":{"$t":"2019-05-24T15:33:03.747Z"},"updated":{"$t":"2019-06-19T19:19:20.948Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-24T15:37:44.767Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"May 2019"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eMay 2019\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eArchives: \u003c/span\u003e\u003ca href\u003d\"http://go/animations-team-highlights\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team-highlights\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:532px;height:308px\"\u003e\u003cimg height\u003d\"308\" src\u003d\"https://lh5.googleusercontent.com/y55oEKmeWfBAk_jdj6Q_izzXpBOZT6wuau4DNg6VPlbK-sThHRNyJx-OLWmLi11KVTyFORLWHzUEFaMdOEizHaMLLCyEd60zW6RyGpQP56AVWVuvWjkRQJk6_yvWAC_LMfmW84mr\" style\u003d\"margin-left:0px;margin-top:0px\" title\u003d\"Points scored\" width\u003d\"532\" /\u003e\u003c/span\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe slight decrease in 'interface' from Chrome 75 to 76 is due to newly added tests\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Animations, road to shipping\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOur investment in interop work for Web Animations continues to produce good results, largely thanks to hard work by Kevin (kevers@). Over the last two Chrome versions our pass rate for the \u003c/span\u003e\u003ca href\u003d\"https://github.com/web-platform-tests/wpt/tree/master/web-animations\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Platform Tests\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e has increased by 45% (absolute) for the timing-model tests and a massive 70% (absolute) for the interface tests! Improvements like these allow us to continue to ship more of Web Animations - recently we shipped \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/blink-dev/lTYK1HT47Qk/hmwmGm1ZBAAJ\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation.updatePlaybackRate\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/blink-dev/Gstf0GA7cbg/711ymCKKAAAJ\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation.pending\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:100%;table-layout:fixed\"\u003e\u003ccolgroup\u003e\u003ccol /\u003e\u003ccol /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eCode Health\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRob (flackr@) has been focused on improving the composited animations code in the new \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/836884\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epost-BGPT world\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. This sprint he landed a series of patches (\u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1611762\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1609672\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1610304\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1461341\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e4\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e) to eliminate animation specific ElementId tracking in LayerTree. This simplification makes the architecture easier to understand, improves CPU usage and reduces memory usage - a triple win!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll Snap\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll Snap is continuing to gain traction, with AirBnB being the latest partner to \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/920482#c9\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003estart using the feature\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and Firefox \u003c/span\u003e\u003ca href\u003d\"https://bugzilla.mozilla.org/show_bug.cgi?id\u003d1312165#c6\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003econtinuing to implement\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the new spec. On our side we have shifted into supporting the product: Majid (majidvp@) has been busy triaging bugs, addressing partner requests, and polishing the code.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/histograms?endDate\u003d20190515\u0026amp;dayCount\u003d7\u0026amp;histograms\u003dBlink.Animation.CompositedAnimationFailureReason\u0026amp;fixupData\u003dtrue\u0026amp;showMax\u003dtrue\u0026amp;filters\u003disofficial%2CEQ%2CTrue\u0026amp;implicitFilters\u003disofficial\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:283px;height:234px\"\u003e\u003cimg height\u003d\"113.00000000000003\" src\u003d\"https://lh6.googleusercontent.com/IUKoi9dwyyJhEUdaoyDeGdtFoKLI_WO1j-Bkzk1s7RxSaP9ZZYTk6ugL1KHylCTX2IE5K6Vc8zvKUpKocBFDwF48OQJatYnjlXsJSSukICRCRvLKb6q2vVaHw_SM40RBFyXQDBtm\" style\u003d\"margin-left:0px;margin-top:60.50000000000001px\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eUnderstanding performance better\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStephen (smcgruer@) landed a new \u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/histograms/?endDate\u003d20190519\u0026amp;dayCount\u003d7\u0026amp;histograms\u003dBlink.Animation.CompositedAnimationFailureReason\u0026amp;fixupData\u003dtrue\u0026amp;showMax\u003dtrue\u0026amp;filters\u003disofficial%2CEQ%2CTrue\u0026amp;implicitFilters\u003disofficial\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUMA metric\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e this sprint to track why animations fail to run on the fast path. This allows the team to better understand where effort is needed to speed up existing animations on the web - vital for smoother user experiences.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:203px;height:237px\"\u003e\u003cimg height\u003d\"237\" src\u003d\"https://lh5.googleusercontent.com/z-ajU372TxKnGgMOwOSQa30PmFdlpv-ZAWn_gZBkcvv91oDDyy9-Bl3W3t3Wz76F7OXc-VG3wxCP9PjyxClhdVKJ_fju9h25ymlvF0X3iSQxTQNEvzGHRYOqClEi9F-tWHW2zBrp\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"203\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eSmoothly animating Paint Worklets\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOne of the key goals of the \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1USTH2Vd4D2tALsvZvy4B2aWotKWjkCYP5m0g7b90RAU/edit?ts\u003d5bb772e1#heading\u003dh.2zu1g67jbavu\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOff-Thread PaintWorklet\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e project is to enable smoothly animating Paint Worklets even when the main thread is busy. Xida (xidachen@) has been working on a \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1601334\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eprototype\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e of the Animation integration and this sprint was able to show smoothly animating, raster inducing (!) Paint Worklets even as the main thread janked.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"border:none;display:inline-block;overflow:hidden;width:570px;height:389px\"\u003e\u003cimg height\u003d\"389\" src\u003d\"https://lh6.googleusercontent.com/sRxCDjOAzL3r8SXmttXLNpN6Qv2eHz7ELPwsaSWGcNBfhPr-lYE0vfmMGuUSQh2O6l4vCBAPSKukS8vr5ErGy8AdZLMFNnBmBDhDUHyAXNQCa6ct9JHPukEztHaoy-SOjHR4uFRU\" style\u003d\"margin-left:0px;margin-top:0px\" width\u003d\"570\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet - Pointer Events proof of concept\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis sprint, Majid (majidvp@) created \u003c/span\u003e\u003ca href\u003d\"https://majido.github.io/houdini-samples/animation-worklet/touch-input/drag.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ea prototype demo\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e showing the power of off-thread input events combined with Animation Worklet. The ability to produce rich interactive effects which can be performance isolated from the main thread is very exciting, and we are continuing to invest in producing a spec for \u003c/span\u003e\u003ca href\u003d\"https://discourse.wicg.io/t/proposal-exposing-input-events-to-worker-threads\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eevent delegation to workers/worklets\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn other AnimationWorklet news, this sprint Jordan (jortaylo@microsoft.com) began \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1568315\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003elanding support\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to expose the full \u003c/span\u003e\u003ca href\u003d\"https://drafts.csswg.org/web-animations-1/#the-animationeffect-interface\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimationEffect\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e interface inside the worklet. This is exciting both in terms of giving developers more power as well as welcoming a new contributor to the team!\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv align\u003d\"left\" dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | May 2019\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(66,133,244);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt;overflow:hidden\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/may-2019"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4450355656200110026"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4450355656200110026"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4450355656200110026"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"may-2019"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7561957394737716009"},"published":{"$t":"2015-05-11T18:49:31.115Z"},"updated":{"$t":"2019-06-17T12:44:29.027Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-05T19:37:47.522Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Input Objectives"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eAt Google we define and track progress against our goals using \u003ca href\u003d\"https://www.gv.com/lib/how-google-sets-goals-objectives-and-key-results-okrs\"\u003e\"OKRs\"\u003c/a\u003e (Objectives and Key Results).  Here are most of the OKRs for the input-dev team (a couple minor KRs relating to internal projects such as future Android releases have been omitted for confidentiality reasons).  Note that these are \u003cb\u003eintentionally aggressive\u003c/b\u003e and so we will be happy if we deliver 60%-70% of them.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-2019-Q1-\" /\u003e2019 Q1 \u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cb style\u003d\"font-size:large\"\u003eEventing Sub-team \u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\" /\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-AppGap-\" /\u003eAdd Richness to Web Platform (#AppGap) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eShip predicted points API \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eOff-Main-Thread Input Event Delegation \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003ePointerevents V3 extension \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eShip pointerrawmove \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eVirtual Keyboard API \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eActivation delegation API \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eHTML spec for UAv2 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-ProductExcellence-\" /\u003eProduct Excellence (#ProductExcellence) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eEnable TSF by default  \u003c/div\u003e\u003cdiv\u003eHandle UAv2 post-launch regressions  \u003c/div\u003e\u003cdiv\u003eBe responsive to our users \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eFix impactful bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eDisable platform inputs in testing mode \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eSynthetic pointer events automation (#HappyPath) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eTrusted Activation Triggers \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003ePointerLock coordinates: make the coordinate space well-defined. \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eGPU Benchmarking enhancements (#HappyPath) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eFix Android startup delay caused by slow hardware updates \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eResolve mouse interop issues \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Code-Health-TechnicalExcellence-\" /\u003eCode Health (#TechnicalExcellence) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003ePen input with Palm rejection (crbug.com/852022)  \u003c/div\u003e\u003cdiv\u003eUnified Pointer Capture in Blink \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003ePointerLock coordinates: consolidate calculation of movementX/Y \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-Scrolling-Sub-team-\" /\u003e\u003cfont size\u003d\"4\"\u003eScrolling Sub-team\u003c/font\u003e\u003cspan style\u003d\"font-family:sans;font-size:13.3333px;background-color:transparent;font-weight:normal\"\u003e \u003c/span\u003e\u003c/h2\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-AppGap-1\" /\u003eAdd Richness to Web Platform (#AppGap) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eEnable pull to refresh on the web  \u003c/div\u003e\u003cdiv /\u003e\u003cdiv\u003eScroll to text fragment \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Improve-Performance-FluidUI-\" /\u003eImprove Performance (#FluidUI) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eHold the line on Input Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eImprove scroll prediction with other predictors \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eCompositor touch action \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003eKeyboard threaded scrolling \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Code-Health-TechnicalExcellence-1\" /\u003eCode Health (#TechnicalExcellence) \u003c/h3\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv\u003eNon-Flaky Tests \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Times;font-size:medium\"\u003eScroll Unification \u003c/span\u003e\u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em;font-family:Times;font-size:medium\"\u003eP4\u003c/span\u003e\u003cspan style\u003d\"font-family:Times;font-size:medium\"\u003e \u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-Historical-Objectives-and-Results\" /\u003eHistorical Objectives and Results\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-2018-OKRs\" /\u003e\u003cfont size\u003d\"3\" style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives/2018-okrs\"\u003e2018 OKRs\u003c/a\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-2017-OKRs\" /\u003e\u003cfont size\u003d\"3\" style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives/2017-okrs\"\u003e2017 OKRs\u003c/a\u003e\u003c/font\u003e\u003c/h2\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-2016-OKRs\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives/2016-okrs\" style\u003d\"font-weight:normal;font-size:medium;background-color:transparent\"\u003e2016 OKRs\u003c/a\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2 style\u003d\"font-family:sans;line-height:19.2px\"\u003e\u003ca name\u003d\"TOC-2015-OKRs\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives/2015-okrs\"\u003e\u003cfont size\u003d\"3\" style\u003d\"font-weight:normal\"\u003e2015 OKRs\u003c/font\u003e\u003c/a\u003e\u003cbr /\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6228797494019904443"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7561957394737716009"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7561957394737716009"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7561957394737716009"}],"author":[{"name":{"$t":"Rick Byers"},"email":{"$t":"rbyers@chromium.org"}}],"sites$pageName":{"$t":"input-objectives"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7029954782082764230"},"published":{"$t":"2019-06-16T20:37:39.639Z"},"updated":{"$t":"2019-06-16T20:37:39.670Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-16T20:37:39.639Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Builders.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7029954782082764230"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8782064448318638860"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/sheriff-details-chromium-os/Builders.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7029954782082764230"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7029954782082764230"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7029954782082764230"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7029954782082764230"}],"author":[{"name":{"$t":"Jason Clinton"},"email":{"$t":"jclinton@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5288143801091860858"},"published":{"$t":"2019-06-16T20:32:18.112Z"},"updated":{"$t":"2019-06-16T20:32:18.140Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-16T20:32:18.112Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Test Orchestrator.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5288143801091860858"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8782064448318638860"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/sheriff-details-chromium-os/Test%20Orchestrator.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5288143801091860858"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5288143801091860858"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5288143801091860858"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5288143801091860858"}],"author":[{"name":{"$t":"Jason Clinton"},"email":{"$t":"jclinton@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5515750465501774235"},"published":{"$t":"2019-06-16T19:12:29.825Z"},"updated":{"$t":"2019-06-16T19:12:29.856Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-16T19:12:29.825Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromeOS Parallel CQ - Linear view of CLs.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5515750465501774235"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8782064448318638860"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/sheriff-details-chromium-os/ChromeOS%20Parallel%20CQ%20-%20Linear%20view%20of%20CLs.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5515750465501774235"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5515750465501774235"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5515750465501774235"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5515750465501774235"}],"author":[{"name":{"$t":"Jason Clinton"},"email":{"$t":"jclinton@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"USl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/236008099758569209"},"published":{"$t":"2012-06-13T20:39:30.018Z"},"updated":{"$t":"2019-06-13T23:42:47.963Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-13T23:42:45.806Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Rendering Benchmarks (aka Smoothness benchmarks)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Deprecated:-see-https:-chromium.googlesource.com-chromium-src-master-docs-speed-benchmark-harnesses-rendering.md\" /\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDeprecated: see \u003c/span\u003e\u003c/b\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/speed/benchmark/harnesses/rendering.md\" style\u003d\"background-color:transparent;font-family:Arial,Verdana,sans-serif;font-size:10pt;font-weight:normal\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/speed/benchmark/harnesses/rendering.md\u003c/a\u003e\u003c/h2\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Contact:-nduca-ernstm\" /\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eContact: nduca, ernstm\u003c/span\u003e\u003c/b\u003e\u003c/h2\u003e\u003c/b\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Chrome-now-has-an-awesome-rendering-benchmark-system-for-GPU-and-rendering-related-benchmarks.-It-works-on-all-chrome-flavors-even-android-and-CrOS-even-in-their-content_shell-forms.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eChrome now has an awesome rendering benchmark system for GPU and rendering related benchmarks. \u003c/span\u003eIt works on all chrome flavors, even android and CrOS, even in their content_shell forms\u003cspan style\u003d\"font-weight:normal\"\u003e.\u003c/span\u003e\u003c/h3\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-We-use-the-following-terminology:action:-an-interaction-with-a-web-page-that-we-want-to-measure.-e.g.-scrolling-or-simply-waiting-for-a-few-secondspage-set:-a-collection-of-web-pages-and-associated-actionsmetric:-computes-high-level-statistical-measures-e.\" /\u003e\u003cdiv style\u003d\"font-size:medium;font-family:arial,sans-serif;font-weight:normal;white-space:pre-wrap\"\u003eWe use the following terminology:\u003c/div\u003e\u003cdiv style\u003d\"font-size:medium;font-family:arial,sans-serif\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eaction:\u003cspan style\u003d\"font-weight:normal\"\u003e an interaction with a web page that we want to measure. e.g. scrolling, or simply waiting for a few seconds\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003epage set:\u003cspan style\u003d\"font-weight:normal\"\u003e a collection of web pages and associated actions\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003emetric:\u003cspan style\u003d\"font-weight:normal\"\u003e computes high-level statistical measures (e.g. means and medians) from raw data (e.g. traces).\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003emeasurement:\u003cspan style\u003d\"font-weight:normal\"\u003e loads the pages from a page set, executes the associated actions, collects raw data, and computes final results using a metric.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003ebenchmark:\u003cspan style\u003d\"font-weight:normal\"\u003e bundles together a measurement and a page_set\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-To-run-the-rendering-benchmarks-you-need:\" /\u003e \u003cspan style\u003d\"font-weight:normal\"\u003eTo run the rendering benchmarks you need:\u003c/span\u003e\u003c/h3\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-A-chrome-checkout-get-the-code-A-chrome-build.-Just-canary-or-a-stable-will-work.-Or-download-a-continuous-build-from-http:-commondatastorage.googleapis.com-chromium-browser-continuous-index.htmlpython.Once-you-ve-got-these-things-you-re-ready-to-go.-To-ru\" /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eA chrome checkout (\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/get-the-code\"\u003eget the code\u003c/a\u003e)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eA chrome build. Just canary or a stable will work. Or download a continuous build from \u003ca href\u003d\"http://commondatastorage.googleapis.com/chromium-browser-continuous/index.html\"\u003ehttp://commondatastorage.googleapis.com/chromium-browser-continuous/index.html\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003epython.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:medium;font-weight:normal;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial,Verdana,sans-serif\"\u003eOnce you've got these things, you're ready to go. To run our top 25 page set through our smoothness measurement (which tests scrolling speed for sites that scroll, or interaction speed for sites that have interactions):\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(239,239,239)\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"line-height:13px\"\u003e./run_benchmark\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:rgb(239,239,239);color:rgb(0,96,0);font-family:monospace;line-height:13px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:rgb(239,239,239);color:rgb(0,96,0);font-family:monospace;line-height:13px\"\u003e--browser\u003dcanary smoothness.top_25\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-To-measure-impl-side-painting-on-important-mobile-sites:\" /\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;font-weight:normal;white-space:pre-wrap;background-color:transparent\"\u003eTo measure impl-side painting on important mobile sites:\u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont size\u003d\"3\" style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(239,239,239);color:rgb(0,96,0);font-family:monospace;line-height:13px;font-size:10pt\"\u003et\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;background-color:rgb(243,243,243)\"\u003eools/perf/\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13px;line-height:13px;white-space:normal;background-color:rgb(239,239,239)\"\u003erun_benchmark\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;background-color:rgb(243,243,243)\"\u003e --browser\u003dcanary smoothness.key_mobile_sites\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cfont size\u003d\"3\" style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cdiv style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:medium;white-space:pre-wrap\"\u003eTo measure the key mobile sites on an attached android device:\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:medium;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:medium;white-space:pre-wrap\"\u003e\u003cblockquote style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003etools/perf/\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003erun_benchmark\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003e --browser\u003dandroid-chrome smoothness.top_25\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:medium;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-To-run-the-smoothness-measurement-on-a-Chrome-OS-device-with-IP-address-CHROMEBOOK_IP-from-a-host-machine-with-a-chromium-checkout-do-this:\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eTo run the smoothness measurement on a Chrome OS device with IP address \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:medium;font-weight:normal;white-space:pre-wrap\"\u003e$CHROMEBOOK_IP\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e from a host machine with a chromium checkout, do this:\u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003e\u003ccode\u003etools/perf/\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003e\u003ccode\u003erun_benchmark\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px\"\u003e\u003ccode\u003e\u003cspan style\u003d\"background-color:rgb(239,239,239)\"\u003e --browser\u003dcros-chromeos --remote\u003d$CHROMEBOOK_IP smoothness.top_25\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cfont size\u003d\"3\" style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent\"\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent\"\u003eLets break down this command a bit:\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;white-space:pre-wrap;font-size:medium\"\u003e\u003cb\u003e\u003ccode\u003etools/perf\u003c/code\u003e\u003c/b\u003e is where we keep our rendering benchmarks. It \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;white-space:pre-wrap;font-size:medium\"\u003econtains benchmarks, which are written in Python.\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\r\n\r\n\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003cb\u003e\u003ccode\u003erun_benchmark\u003c/code\u003e\u003c/b\u003e is the script we use to run a specific benchmark. Benchmarks are a combination of a \"measurement\" (e.g. numbers to compute) and a list of pages to compute those numbers for.\r\n\r\n\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003cb\u003e\u003ccode\u003e--browser\u003dcanary\u003c/code\u003e\u003c/b\u003e tells the script to use Chrome Canary, if it is installed on the system. If you don't have canary [e.g. you're on Linux] it'll fail and tell you to give it another browser.\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003dlist\u003c/code\u003e - for all browsers that the script thinks it can use. Pass --browser\u003dlist -vvv if you're not seeing a browser you expect to see.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003dsystem\u003c/code\u003e - the stable chrome install on your system\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003ddebug\u003c/code\u003e or \u003ccode\u003erelease\u003c/code\u003e - chromium from out/Debug or out/Release, if it was found\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003dcontent-shell-debug\u003c/code\u003e - a content shell build found in out/Debug\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003dandroid-chrome\u003c/code\u003e - chrome detected on an attached android device via adb\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003ccode\u003e--browser\u003dcros-chrome --remote\u003d$CHROMEBOOK_IP\u003c/code\u003e - chrome running on your chromebook\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003e\u003ccode\u003e--browser\u003dexact --browser-executable\u003d\u0026lt;path to build\u0026gt;\u003c/code\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003eyour tests will work with any chrome build \u0026gt;\u003d M18!\r\n\r\n\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003ccode\u003esmoothness.top_25\u003c/code\u003e\u003c/b\u003e is one of our canned benchmarks to run. If you type \u003ccode\u003e./run_benchmark\u003c/code\u003e, you'll see a list of other benchmarks that we support. There are a lot, and you can add more. :)\r\n\r\n\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003ccode\u003etools/perf/page_sets/top_25.py\u003c/code\u003e\u003c/b\u003e is a list of 25 pages that get a tremendous amount of volume on desktop, and hence are important for us to not regress. This pageset is used by a variety of benchmarks, from smoothness to thread times. There are other sets of pages too, for example \u003ccode\u003ekey_desktop_sites\u003cfont color\u003d\"#000000\" face\u003d\"Arial\"\u003e, \u003c/font\u003e\u003c/code\u003e\u003ccode\u003ekey_mobile_sites,\u003c/code\u003e and \u003ccode\u003etough_scrolling_cases\u003c/code\u003e. Some have hundreds or thousands of sites. Some have only a few.\r\n\r\n\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eIf you want to have a benchmark that computes smoothness, but for a different pageset, then just copy an existing benchmark's .py file and make a new one from it that points at your favorite pageset.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWhen you run a benchmark, you'll get some output that looks like this:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cdiv style\u003d\"line-height:13px\"\u003e\u003cspan style\u003d\"font-size:medium;background-color:rgb(243,243,243);white-space:pre-wrap\"\u003ePages: [http___www.youtube.com]\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(243,243,243);line-height:13px;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003e*RESULT frame_times: frame_times\u003d [16.900000,17.280000,17.340000,16.810000,17.400000,17.500000,17.020000,16.820000,17.070000,17.190000,17.560000,17.670000,17.450000,17.570000,17.270000,17.410000,17.590000,17.530000,17.240000,17.550000,17.190000,17.140000,17.090000,17.500000,17.540000,17.000000,17.300000,17.600000,17.430000,17.070000,17.070000,17.760000,17.090000,16.950000,17.020000,17.040000,16.780000,17.060000,17.700000,17.850000,17.230000,17.090000,17.110000,17.110000,17.610000,17.200000,16.990000,17.180000,17.140000,17.130000,17.430000,17.080000,17.100000,17.100000,17.970000,17.150000,17.600000,17.400000,17.140000,16.920000,17.790000,16.780000,17.440000,16.860000,17.720000,17.700000,17.610000,16.940000,17.200000,16.980000,17.260000,17.310000,17.380000,16.960000,17.000000,17.500000,17.240000,17.170000] ms\r\nAvg frame_times: 17.267564ms\r\nSd frame_times: 0.279332ms\r\n*RESULT jank: jank\u003d 19.4673 \r\n*RESULT mean_frame_time: mean_frame_time\u003d 17.268 ms\r\n*RESULT mostly_smooth: mostly_smooth\u003d 1.0 \r\nRESULT telemetry_page_measurement_results: num_failed\u003d 0 count\r\nRESULT telemetry_page_measurement_results: num_errored\u003d 0 count\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"line-height:13px;white-space:pre-wrap\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003eThese are some key statistics for that page as it scrolled, in the default mode for that platform. But, lets say you wanted to run chrome with some extra commandline arguments. For this, \u003ccode\u003e--extra-browser-args\u003c/code\u003e is your friend:\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cdiv style\u003d\"font-family:Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ccode\u003etools/perf/run_benchmark --browser\u003dcanary smoothness.top_25 tools/perf/page_sets/top_25.json --extra-browser-args\u003d\"--force-llamas-to-have-parachutes --use-rainbows-instad-of-omnibox\"\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial\"\u003e\u003cspan\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cfont size\u003d\"3\"\u003eFun! Remember, unless you pass \u003ccode\u003e--disable-gpu-vsync\u003c/code\u003e, scrolling goes only as fast as your screen. So, for screen with 60 Hz refresh, 16.6 is usually a good thing.\u003c/font\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3 style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003ca name\u003d\"TOC-Smoothness-Metrics\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eSmoothness Metrics\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"white-space:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eThese are the most important smoothness metrics:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003emean_frame_time\u003c/b\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003e: arithmetic mean of frame times\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(34,34,34)\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cb\u003ejank\u003c/b\u003e: absolute discrepancy of frame time stamps, where discrepancy is a measure of irregularity. It quantifies the worst jank. For a single pause, discrepancy corresponds to the length of this pause in milliseconds. Consecutive pauses increase the discrepancy. The metric is important because even if the mean and 95th percentile are good, one long pause in the middle of an interaction is still bad.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(34,34,34)\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cb\u003emostly_smooth\u003c/b\u003e: were 95 percent of the frames hitting 60 fps; boolean value (1/0).\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003eframe_times\u003c/b\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003e: list of raw frame times, helpful to understand the above 3 metrics\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003e\u003cb\u003emean_pixels_approximated\u003c/b\u003e: percentage of pixels that was approximated (checkerboarding, low-resolution tiles, etc.).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent;color:rgb(34,34,34)\"\u003e\u003cb\u003emean_input_event_latency\u003c/b\u003e: time between receiving a touchmove event and performing the frame swap for the corresponding scroll event.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3 style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003ca name\u003d\"TOC-Rasterize_And_Record-Metrics\" /\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eRasterize_And_Record Metrics\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003e\u003ca name\u003d\"TOC-Throughout-the-metrics-you-will-see-the-words-paint-record-and-raster.-These-have-very-precise-meanings:\" /\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;background-color:transparent;font-weight:normal\"\u003eThroughout the metrics, you will see the words \u003ci\u003epaint\u003c/i\u003e, \u003ci\u003erecord\u003c/i\u003e, and \u003ci\u003eraster\u003c/i\u003e. These have very precise meanings:\u003c/span\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003epaint:\u003c/b\u003e Time dumping WebKit's rendering structures into the compositor's rendering structures in software mode and regular compositing modes. T\u003c/font\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003ehis is the time spent to walk the webkit tree AND software-rasterize its 2D ops AND any time required to do image decodes\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003erecord: \u003c/b\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:medium\"\u003e(impl-side painting mode only). This is the time to JUST walk the WebKit tree and dump it into an SkPicture.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eraster: \u003c/b\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent\"\u003e(impl-side painting mode only). \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium;background-color:transparent\"\u003eThis is the time to rasterize SkPictures to tiles. If we had a decode cache miss, will include time servicing the image cache miss.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eIn some sense impl-side painting splits paint into raster + record.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003erasterize_and_record measurement calculates the time spent in raster and record. It automatically enables impl-side painting and only works on platforms that support this feature.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap\" /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"background-color:transparent;font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003eHow it works\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;font-size:medium;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/telemetry\" style\u003d\"background-color:transparent\"\u003eTelemetry\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e performance testing framework\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap;font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ePage scrolling is done by telemetry's \"scroll\" action, \u003ccode\u003etools/telemetry/telemetry/internal/actions/scroll.py\u003c/code\u003e. On chrome, it boots the browser with \u003ccode\u003e--enable-gpu-benchmarking-extension\u003c/code\u003e, which exposes a \u003ccode\u003ebeginSmoothScrollBy(numPixels, function() { callback })\u003c/code\u003e API to javascript that simulates scrolling as would be done by the user. We then use it to move a page down.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eOther synthetic gestures, such as pinch-to-zoom or swipe, are available. See the \u003ca href\u003d\"https://docs.google.com/a/chromium.org/document/d/1VZ0FhQVc5e2HA9_mJ3HRQlXylCMgNiEJx9kVXe7yTfE/edit?usp\u003dsharing\"\u003eSynthetic Gestures in Chrome\u003c/a\u003e document for a full list of gestures and how they're implemented in Chrome.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003eThe smoothness \u003c/font\u003e\u003cfont face\u003d\"Arial\"\u003emeasurement \u003ccode\u003etools/perf/measurements/smoothness.py\u003c/code\u003e captures a trace from this interaction, and extracts the time stamps of frames that were generated. Specifically, the \u003c/font\u003e\u003ccode style\u003d\"font-family:Arial\"\u003eBenchmarkInstrumentation::ImplThreadRenderingStats\u003c/code\u003e\u003cfont face\u003d\"Arial\"\u003e and \u003c/font\u003e\u003ccode style\u003d\"font-family:Arial\"\u003eBenchmarkInstrumentation::MainThreadRenderingStats\u003c/code\u003e\u003cfont face\u003d\"Arial\"\u003e events are analyzed. These events are issued from \u003c/font\u003e\u003ccode style\u003d\"font-family:Arial\"\u003ecc/debug/benchmark_instrumentation.cc\u003c/code\u003e\u003cfont face\u003d\"Arial\"\u003e based on data collected through \u003c/font\u003e\u003ccode style\u003d\"font-family:Arial\"\u003ecc/debug/rendering_stats_instrumentation.h\u003c/code\u003e\u003cfont face\u003d\"Arial\"\u003e. The smoothness metric \u003c/font\u003e\u003ccode style\u003d\"font-family:Arial\"\u003etools/perf/metrics/smoothness.py\u003c/code\u003e\u003cfont face\u003d\"Arial\"\u003e is then used to calculate the metrics described above (mean_fram_time, jank, etc.).\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eTelemetry provides a way to separate out the measurement process from the interaction process from the actual pages being tested. We then maintain a number of important lists of web pages (page sets), some synthetic some real, in \u003ccode\u003etools/perf/page_sets\u003c/code\u003e, grouped by their kind of importance. \u003ccode\u003etop_25\u003c/code\u003e, \u003ccode\u003ekey_desktop_sites\u003c/code\u003e and \u003ccode\u003ekey_mobile_sites\u003c/code\u003e are likely of particular interest to users.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eTelemetry provides a mechanism to very reliably record a web page and then replay it many times in that exact recorded state. We (Chrome team) cannot make our recordings public since the assets the recording are the property of the site owners. However, we have exposed a utility that anyone can use to make their own recordings:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px;background-color:rgb(239,239,239)\"\u003etools/perf/record_wpr --browser\u003dsystem tools/perf/page_sets/top_25.json\u003cbr /\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThis will place a file called \u003ccode\u003etop_25.wpr\u003c/code\u003e in \u003ccode\u003etools/perf/page_sets/data\u003c/code\u003e that is an archive of the data required to replay those pages back over-and-over again without deviation.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Adding-credentials-to-test-live-sites-that-require-a-logged-in-user\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eAdding credentials to test live sites that require a logged in user\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;font-size:medium\"\u003eAs part of GPU testing, we often want to measure the performance of a site like Gmail, or Facebook, that sit behind a login. We do not give out logins for these, but if you have your own, you can put a \u003c/span\u003e\u003ccode style\u003d\"white-space:pre-wrap\"\u003ecredentials.json\u003c/code\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;font-size:medium\"\u003e in \u003ccode\u003etools/perf/page_sets/data\u003c/code\u003e or \u003ccode\u003e~/.telemetry-credentials\u003c/code\u003e in the style of \u003ccode\u003etools/telemetry/examples/credentials_example.json\u003c/code\u003e with the right logins and telemetry will automatically then login to gmail or facebook for you. Patches are welcome to add support for other sites as well.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-benchmarks"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/236008099758569209"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/236008099758569209"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/236008099758569209"}],"author":[{}],"sites$pageName":{"$t":"rendering-benchmarks"},"sites$revision":{"$t":"28"}},{"gd$etag":"\"XSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4309374619548446851"},"published":{"$t":"2010-05-05T15:23:17.486Z"},"updated":{"$t":"2019-06-13T04:46:34.979Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-13T04:46:32.425Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How to make a web standards proposal"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003ePlease see \u003ca href\u003d\"https://www.chromium.org/blink/launching-features\"\u003ehttps://www.chromium.org/blink/launching-features\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/make-a-web-standards-proposal"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4309374619548446851"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4309374619548446851"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4309374619548446851"}],"author":[{"name":{"$t":"Ojan Vafai"},"email":{"$t":"ojan@chromium.org"}}],"sites$pageName":{"$t":"make-a-web-standards-proposal"},"sites$revision":{"$t":"24"}},{"gd$etag":"\"WCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7478307036355186463"},"published":{"$t":"2015-06-03T18:24:00.324Z"},"updated":{"$t":"2019-06-12T13:44:18.980Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-12T13:44:17.226Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Testing WebUI with Mocha"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eAs Chromium focuses on building modular WebUI using web components and well-defined API calls, we aim to phase out and ultimately replace \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/domui-testing/webui-browser_tests\"\u003eWebUIBrowserTest\u003c/a\u003e with a mocha-based alternative. \u003ca href\u003d\"http://mochajs.org\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eMocha\u003c/a\u003e is a flexible, lightweight test framework with strong async support. With mocha, we can write small unit tests for individual features of components instead of grouping everything into a monolithic browser test.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAdvantages of using mocha over vanilla browser tests include:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAllowing multiple test definitions within one browser test, amortizing the browser spin-up cost over several tests\u003c/li\u003e\r\n\u003cli\u003ePinpointing failure locations, even when several tests fail within one browser test or when assertions fail inside in helper functions\u003c/li\u003e\r\n\u003cli\u003eAssociating uncaught exceptions with the correct test\u003c/li\u003e\r\n\u003cli\u003eReporting test durations and flagging slow tests\u003c/li\u003e\r\n\u003cli\u003eFast test iteration -- changes to tests may not require recompiling\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eThis framework is a work in progress; its first consumers are Polymer projects in Chromium.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-the-BrowserTest\" /\u003eAdding the BrowserTest\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ePolymer tests should use \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt;background-color:transparent\"\u003ePolymerTest\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e from \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:10pt;background-color:transparent\"\u003epolymer_browser_test_base.js\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e as their prototype. The following test will set the command-line args \u003cfont face\u003d\"courier new, monospace\"\u003e--my-switch\u003dmy-value\u003c/font\u003e and navigate to \u003cfont face\u003d\"courier new, monospace\"\u003echrome://my-webui/\u003c/font\u003e.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e// Polymer BrowserTest fixture.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eGEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e/**\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e * Test fixture for FooBar element.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e * @constructor\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e * @extends {PolymerTest}\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e */\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003efunction FooBarBrowserTest() {}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eFooBarBrowserTest.prototype \u003d {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  __proto__: PolymerTest.prototype,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  /**\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   * Override browsePreload like this if you need to navigate to a particular WebUI.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   * @override\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   */\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  browsePreload: 'chrome://my-webui',\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  /**\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   * Set any command line switches needed by your features.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   */\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  commandLineSwitches: [{\u003cbr /\u003e\r\n    switchName: 'my-switch',\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    switchValue: 'my-value'  // omit switchValue for boolean switches\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  }],\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  /**\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e   * Override extraLibraries to include extra files when the test runs.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   * @override\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   */ \u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    'some_file.js',  // Loads ./some_file.js (relative to source root).\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    '//ui/webui/resources/js/some_file.js',  // Path must be included in browser_tests.isolate.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  ]);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThen, create one or more \u003ccode\u003eTEST_F\u003c/code\u003e functions. Each should register some number of tests with mocha:\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003eTEST_F('FooBarBrowserTest', 'FooBarTest', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  suite('FooBar', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    var fooBar;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Import foo_bar.html before running suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    suiteSetup(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      // Returns a promise, ensuring mocha waits until the resource loads.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      return PolymerTest.importHtml('chrome://resources/foo_bar.html');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Create and initialize a FooBar before each test.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    setup(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      PolymerTest.clearBody();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      fooBar \u003d document.createElement('foo-bar');  // Immediately calls created() and ready().\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      document.body.appendChild(fooBar);  // Immediately calls attached().\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    test('is a FooBar', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      assertEquals('FOO-BAR', fooBar.tagName);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      // ... more work and assertions\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // ... more synchronous and asynchronous tests\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  // ... more test suites\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  // Run all the above tests.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  mocha.run();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eShould you write a large number of tests (woohoo!), it may help to break tests into separate files. For example, if you have \u003cfont face\u003d\"courier new, monospace\"\u003efoo_bar_tests.js:\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003ecr.define('foo_bar', function() {\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  function registerTests() {\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e    suite('FooBar', function() { /* ... */ });\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  }\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e  return {registerTests: registerTests};\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eYou can then include these tests in your main \u003cfont face\u003d\"courier new, monospace\"\u003efoo_bar_browsertest.js \u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eby adding the file to \u003ccode\u003eFooBarBrowserTest.prototype.extraLibraries\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e. Then, in your \u003ccode\u003eTEST_F\u003c/code\u003e, simply call \u003ccode\u003efoo_bar.registerTests()\u003c/code\u003e before the \u003ccode\u003emocha.run()\u003c/code\u003e call.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:731px;height:212px;border:1px solid rgb(204,204,204);padding:5px;background:rgb(252,248,227)\"\u003e\r\n\u003ch4 style\u003d\"margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Including-JS-files-in-tests\" /\u003e\u003cb\u003eIncluding JS files in tests\u003c/b\u003e\u003c/h4\u003e\r\n\u003cdiv\u003eFiles imported via \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px\"\u003eextraLibraries\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e are read when the test runs. In isolated testing, only certain files are copied to the bots. \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eFiles in \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px\"\u003echrome/test/data\u003c/font\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e are always copied over, but\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e \u003c/span\u003e\u003cb style\u003d\"font-size:13.3333px\"\u003eif your test requires files in other directories, be sure the file or some parent directory is included in \u003c/b\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13.3333px\"\u003e\u003cb\u003echrome/browser_tests.isolate\u003c/b\u003e\u003c/span\u003e\u003cb style\u003d\"font-size:13.3333px\"\u003e.\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\nExplanation: js2gtest allows #include-style imports of JavaScript using \u003ccode\u003eGEN_INCLUDE\u003c/code\u003e and the \u003ccode\u003eextraLibraries\u003c/code\u003e property of the test fixture prototype. These should be relative to the file defining your test fixture.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nUse \u003ccode\u003eGEN_INCLUDE\u003c/code\u003e when the file needs to be included before the rest of the script is run. This will also result in the code being eval'd during the js2gtest step.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nUse the \u003ccode\u003eextraLibraries\u003c/code\u003e property of your test fixture's prototype when the file is only needed within your tests. The content of these files, along with any \u003ccode\u003eGEN_INCLUDE\u003c/code\u003ed files, are added to each GTest body before each test is run.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nBecause these files are read at runtime, they must be present when running the browser_tests binary. This is only a concern in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/isolated-testing/for-swes\"\u003eisolated testing\u003c/a\u003e, and placing included files in \u003cfont face\u003d\"courier new, monospace\"\u003echrome/test/data\u003c/font\u003e should always work.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Running-the-tests\" /\u003eRunning the tests\u003c/h3\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Just-build-and-run-like-any-other-browser_tests.-You-may-filter-tests-by-class-or-test-name-the-arguments-to-TEST_F-via-gtest_filter.-ninja--C-out-Release-browser_tests-.-out-Release-browser_tests---gtest_filter-FooBarBrowserTest.Foo-\" /\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333px;font-weight:normal\"\u003eJust \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/testing/browser-tests\"\u003ebuild and run like any other browser_tests\u003c/a\u003e. You may filter tests by class or test name (the arguments to TEST_F) via gtest_filter.\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333px;font-weight:normal\"\u003e\u003ccode\u003eninja -C out/Release browser_tests\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333px;font-weight:normal\"\u003e\u003ccode\u003e./out/Release/browser_tests --gtest_filter\u003dFooBarBrowserTest.Foo*\u003c/code\u003e\u003c/div\u003e\r\n\u003c/h3\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Tests-and-suites\" /\u003eTests and suites\u003c/h3\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-With-mocha-we-can-define-any-number-of-suites-each-suite-can-consist-of-any-number-of-tests.-Top-level-tests-are-in-the-global-suite-but-it-is-recommended-to-always-create-an-outer-suite-for-your-tests.-Each-suite-and-test-call-takes-a-name-and-a-function.\" /\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333px;font-weight:normal\"\u003eWith mocha, we can define any number of \u003cb\u003esuites\u003c/b\u003e; each suite can consist of any number of \u003cb\u003etests\u003c/b\u003e. Top-level tests are in the global suite, but it is recommended to always create an outer suite for your tests. Each \u003cb\u003esuite \u003c/b\u003eand \u003cb\u003etest\u003c/b\u003e call takes a name and a function.\u003c/div\u003e\r\n\u003c/h3\u003e\r\n\u003cdiv\u003eWe can also define a \u003cb\u003esuiteSetup\u003c/b\u003e to run at the beginning of a suite, a \u003cb\u003esetup\u003c/b\u003e to run before each test in a suite, a \u003cb\u003eteardown\u003c/b\u003e to run after each test in a suite, and a \u003cb\u003esuiteTeardown\u003c/b\u003e to run once a suite is completed.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSuites can be nested; each \u003cb\u003esetup\u003c/b\u003e and \u003cb\u003eteardown\u003c/b\u003e also applies to all tests in nested suites.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eBy default, hooks and tests are synchronous. Any of the functions used in these calls can take a \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt;background-color:transparent\"\u003edone\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e callback as a parameter, causing mocha to wait until the \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt;background-color:transparent\"\u003edone\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e parameter is called before moving to the next test or hook. \u003c/span\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003eThe \u003ccode\u003edone\u003c/code\u003e callback must be called with an \u003ccode\u003eError\u003c/code\u003e on failure, or no arguments on success.\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003esuite('Outer suite', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  suiteSetup(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Function to run at the beginning of this suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  setup(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Function to run before each test within this suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e  test(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    // A test that runs after setup is called.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e  test(function(done) {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    // An asynchronous test that runs after setup is called again.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    setTimeout(done, 1000);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e  teardown(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    // Function to run after each test in this suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  suiteTeardown(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Function to run at the very end of this suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  suite('Inner suite', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    // Another suite. We can define separate suiteSetup and setup functions here that only run within this suite.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cb\u003e\r\nInstead of taking a \u003ccode\u003edone\u003c/code\u003e parameter, an asynchronous hook or test can return a \u003ccode\u003ePromise\u003c/code\u003e.\u003c/b\u003e The test succeeds or fails once the promise is resolved or rejected.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\" /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e// Notice no done callback is taken.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003esuiteSetup(function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  return new Promise(function(resolve, reject) {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    window.addEventListener('thingCreated', resolve);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    createThingAsync();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003etest('Something doesn\\'t happen', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ccode\u003e  return new Promise(function(resolve, reject) {\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    // Ensure no event fires.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003ccode\u003e    window.addEventListener('change', reject);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    setTimeout(resolve, 1000);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    somethingShouldNotChange();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  });\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-More-features\" /\u003eMore features\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eFor more mocha features, see \u003ca href\u003d\"http://mochajs.org/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ethe documentation\u003c/a\u003e. The API is well documented \u003ca href\u003d\"https://github.com/mochajs/mocha/blob/master/lib/mocha.js\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ewithin the source\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/26204367840923486"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/updating-webui-for-material-design/testing-webui-with-mocha"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7478307036355186463"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7478307036355186463"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7478307036355186463"}],"author":[{"name":{"$t":"Michael Giuffrida"},"email":{"$t":"michaelpg@chromium.org"}}],"sites$pageName":{"$t":"testing-webui-with-mocha"},"sites$revision":{"$t":"21"}},{"gd$etag":"\"Wyl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5048080902362104097"},"published":{"$t":"2009-11-11T18:22:30.627Z"},"updated":{"$t":"2019-06-06T20:44:07.219Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-06T20:44:05.136Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SPDY"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eSPDY is deprecated.  This page is out of date.\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSPDY was an experimental protocol for the web with the primary goal to \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ereduce latency of web pages.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  Its successor is \u003ca href\u003d\"http://httpwg.org/specs/rfc7540.html\" rel\u003d\"nofollow\"\u003eHTTP/2\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eDocumentation\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-whitepaper\"\u003eSPDY: An experimental protocol for a faster web\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol\"\u003eSPDY protocol specification\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/link-headers-and-server-hint\"\u003eServer Push and Server Hint\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft1\" /\u003eResearch\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/An_Argument_For_Changing_TCP_Slow_Start.pdf?attredirects\u003d0\"\u003eAn Argument For Changing TCP Slow Start\u003c/a\u003e - Mike Belshe 01/11/10\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://docs.google.com/a/chromium.org/viewer?a\u003dv\u0026amp;pid\u003dsites\u0026amp;srcid\u003dY2hyb21pdW0ub3JnfGRldnxneDoxMzcyOWI1N2I4YzI3NzE2\"\u003eMore Bandwidth Doesn't Matter (much)\u003c/a\u003e - Mike Belshe 04/08/10\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eStandards Work\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00.html\" rel\u003d\"nofollow\"\u003eSSL Next-Protocol-Negotiation Extension \u003c/a\u003e- Adam Langley 01/20/10\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://tools.ietf.org/html/draft-bmoeller-tls-falsestart-00\" rel\u003d\"nofollow\"\u003eTLS False Start\u003c/a\u003e - Langley, Modadugu, Mueller 06/2010\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://tools.ietf.org/html/draft-agl-tls-snapstart-00\" rel\u003d\"nofollow\"\u003eTLS Snap Start\u003c/a\u003e - Adam Langley 06/18/2010\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-authentication\"\u003eSPDY Server and Proxy Authentication\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eCode\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eChromium client implementation: \u003ca href\u003d\"https://cs.chromium.org/chromium/src/net/spdy/\"\u003ehttps://cs.chromium.org/chromium/src/net/spdy/\u003c/a\u003e\u003c/li\u003e\u003cul /\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eDiscuss\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003ca href\u003d\"http://groups.google.com/group/spdy-dev\"\u003ehttp://groups.google.com/group/spdy-dev\u003c/a\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eExternal work\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eServers\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eJetty Web Server:  \u003c/span\u003e\u003ca href\u003d\"http://wiki.eclipse.org/Jetty/Feature/SPDY\" rel\u003d\"nofollow\"\u003ehttp://wiki.eclipse.org/Jetty/Feature/SPDY\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial;font-size:small\"\u003eApache module for SPDY: \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/p/mod-spdy/\" style\u003d\"color:rgb(42,93,176);font-family:arial;font-size:small\" target\u003d\"_blank\"\u003ehttp://code.google.com/p/mod-spdy/\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003ePython implementation of a SPDY server: \u003c/span\u003e\u003cspan style\u003d\"font-size:small;border-collapse:separate;font-family:arial\"\u003e\u003ca href\u003d\"http://github.com/mnot/nbhttp/tree/spdy\" rel\u003d\"nofollow\" target\u003d\"_blank\"\u003ehttp://github.com/mnot/nbhttp/tree/spdy\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial;font-size:small\"\u003eRuby SPDY: \u003c/span\u003e\u003ca href\u003d\"https://github.com/igrigorik/spdy\" style\u003d\"font-family:arial;font-size:small\" rel\u003d\"nofollow\"\u003ehttps://github.com/igrigorik/spdy\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial;font-size:small\"\u003enode.js SPDY: \u003c/span\u003e\u003cspan style\u003d\"color:rgb(68,68,68);font-family:arial,sans-serif\"\u003e\u003ca href\u003d\"https://github.com/indutny/node-spdy\" rel\u003d\"nofollow\"\u003ehttps://github.com/indutny/node-spdy\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eLibraries\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eNetty SPDY (Java library):  \u003ca href\u003d\"http://netty.io/blog/2012/02/04/\" rel\u003d\"nofollow\"\u003ehttp://netty.io/blog/2012/02/04/\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eRuby wrapper around Chromium SPDY framer: \u003ca href\u003d\"https://github.com/romanbsd/spdy\" rel\u003d\"nofollow\"\u003ehttps://github.com/romanbsd/spdy\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eGo SPDY: \u003ca href\u003d\"http://godoc.org/code.google.com/p/go.net/spdy\"\u003ehttp://godoc.org/code.google.com/p/go.net/spdy\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eErlang SPDY: \u003ca href\u003d\"https://github.com/RJ/erlang-spdy\" rel\u003d\"nofollow\"\u003ehttps://github.com/RJ/erlang-spdy\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eJava SPDY: \u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px;border-collapse:collapse\"\u003e\u003ca href\u003d\"http://svn.apache.org/repos/asf/tomcat/trunk/modules/tomcat-lite\" rel\u003d\"nofollow\" style\u003d\"color:rgb(42,93,176)\" target\u003d\"_blank\"\u003ehttp://svn.apache.org/repos/asf/tomcat/trunk/modules/tomcat-lite\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eC SPDY (libspdy): \u003ca href\u003d\"http://libspdy.org/index.html\" rel\u003d\"nofollow\"\u003ehttp://libspdy.org/index.html\u003c/a\u003e (to be used by libcurl: \u003ca href\u003d\"http://daniel.haxx.se/blog/2011/10/18/libspdy/\" rel\u003d\"nofollow\"\u003ehttp://daniel.haxx.se/blog/2011/10/18/libspdy/\u003c/a\u003e)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eC SPDY (spindly): \u003ca href\u003d\"https://github.com/bagder/spindly\" rel\u003d\"nofollow\"\u003ehttps://github.com/bagder/spindly\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eC SPDY (spdylay): \u003ca href\u003d\"https://github.com/tatsuhiro-t/spdylay\" rel\u003d\"nofollow\"\u003ehttps://github.com/tatsuhiro-t/spdylay\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eiPhone SPDY: \u003ca href\u003d\"https://github.com/sorced-jim/SPDY-for-iPhone\" rel\u003d\"nofollow\"\u003ehttps://github.com/sorced-jim/SPDY-for-iPhone\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eBrowsers\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eGoogle Chrome\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eMozilla Firefox\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eTools\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-tools-and-debugging\"\u003eSummary of SPDY tools\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/chrome-benchmarking-extension\"\u003eChrome page benchmarking tool\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/spdy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5048080902362104097"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5048080902362104097"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5048080902362104097"}],"author":[{}],"sites$pageName":{"$t":"spdy"},"sites$revision":{"$t":"42"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4983378072493616104"},"published":{"$t":"2011-01-14T00:47:49.248Z"},"updated":{"$t":"2019-06-03T23:52:22.391Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-03T23:52:19.884Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Kernel Configuration"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"display:inline\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Conversions\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eConversions\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Scripts\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eScripts\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-kernelconfig\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003ekernelconfig\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-prepareconfig\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eprepareconfig\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-splitconfig\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003esplitconfig\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-the-kernelconfig-script\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eUsing the kernelconfig script\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Make-a-change-to-the-config-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eMake a change to the config \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Alternative-Method-to-Edit-Config\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eAlternative Method to Edit Config\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Comparing-in-tree-config-to-split-config\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eComparing in-tree config to split config\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Manual-Building\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eManual Building\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Generate-a-new-splitconfig-after-adding-new-Kconfig-options\"\u003e\u003cstrong\u003e8.1 \u003c/strong\u003eGenerate a new splitconfig after adding new Kconfig options\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adding-a-new-config\"\u003e\u003cstrong\u003e8.2 \u003c/strong\u003eAdding a new config\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-can-I-find-the-list-of-flavour-configs\"\u003e\u003cstrong\u003e8.3 \u003c/strong\u003eHow can I find the list of flavour configs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-regenerate-and-validate-splitconfigs-from-single-config\"\u003e\u003cstrong\u003e8.4 \u003c/strong\u003eHow to regenerate and validate splitconfigs from single config\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/h2\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\r\n\u003cp\u003eKernel configuration is a little complicated in Chromium OS. There are a number of different kernels based on architecture (x86_64, arm64) variants (generic, rockchip) and platforms (Seaboard, Mario). We want to split the config into a sort of hierarchy so that the common options are shared between the variants (click to enlarge):\u003c/p\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-configuration/kernel_config_diag.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"274\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1295028130350/chromium-os/how-tos-and-troubleshooting/kernel-configuration/kernel_config_diag.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cp\u003eShown here are 6 flavours, three for ARM and three for Intel (it is not clear why flavours is spelt the British way).\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Conversions\" /\u003eConversions\u003c/h2\u003e\r\n\u003cp\u003eWe need to be able to do the following:\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003ecreate a .config file for a particular flavour - this is done simply by concatenating the three levels for a particular flavour. For example we create the tegra2 flavour by concatenating base.config, armel/common.config and armel/chromeos-tegra2.flavour.config. This .config file is suitable for configuring the kernel.\u003c/li\u003e\r\n\u003cli\u003esplit a .config into its constituent parts. This is a little more complicated and has to be done for all flavours at once. Given a .config file for each flavour we can look for items which are common to all flavours - these can be put into the family config. We also look for everything common within each architecture - these are put into the architecture files like config.common.arm. The splitconfig script does this.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Scripts\" /\u003eScripts\u003c/h2\u003e\r\n\u003cp\u003eScripts to deal with the kernel configuration are in the chromeos/scripts directory. A partial listing is shown below:\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ ls chromeos/scripts/\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ekernelconfig  prepareconfig  splitconfig\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-kernelconfig\" /\u003ekernelconfig\u003c/h3\u003e\r\n\u003cp\u003eThis script deals with each separate flavour in turn, performing the selected operations. It starts by building the config for each flavour, does the operations, and afterwards it splits the flavour configs back into the proper hierarchy.  It supports four operations\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eoldconfig - does a 'make oldconfig' on each config\u003c/li\u003e\u003cli\u003eolddefconfig - like 'oldconfig', but it accepts the default selections automatically\u003c/li\u003e\r\n\u003cli\u003eeditconfig - does a 'make menuconfig' on each config\u003c/li\u003e\r\n\u003cli\u003egenconfig - like oldconfig, but it leaves the generated full config files lying around afterwards in the CONFIGS directory\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eThere is a bit of a problem with kernelconfig. If you want to change a kernel option which is common to all flavours, for example, then you must change it once for each flavour using 'kernelconfig editconfig'. At the moment this is ~10 times! If you miss one, then the result may be no change which can be very confusing. See below for another approach.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-prepareconfig\" /\u003eprepareconfig\u003c/h3\u003e\r\n\u003cp\u003eThis is used to prepare the config for a particular flavour. It assembles the default config for the flavour. \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis is useful when starting development on a board and you want to build in-tree:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"font-weight:normal;background-color:rgb(239,239,239);border:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:14px\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e./chromeos/scripts/prepareconfig chromeos-tegra2\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eexport ARCH\u003darm\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eexport CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi-\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003emake olddefconfig    #(to pick up new options, if any)\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003emake\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e...\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis script is used in the emerge. An example resulting string is 'Ubuntu 2.6.32-0.1-chromeos-tegra2'.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-splitconfig\" /\u003esplitconfig\u003c/h3\u003e\r\n\u003cp\u003eThis takes all config.* files in the currect directory and works out the common options in each. It writes these to config.common, then generates new config.* files (overwriting the original ones) with these common options removed. As a side effect, all config options will be in sorted order.\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis script is used by kernelconfig to extract the common options for an architecture, then again on a second level to extract the common options for Chromium OS.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis script isn't really meant to be run on its own, it's a helper function.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Using-the-kernelconfig-script\" /\u003eUsing the kernelconfig script\u003c/h2\u003e\r\n\u003cp\u003eThe kernel config is split into several config files - generic, chrome-specific, architecture-specific and board specific. Automatic tools split and combine these configs.\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf you want to edit the configuration for a particular board etc. then you need to do something like:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"font-weight:normal;background-color:rgb(239,239,239);border:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:14px\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ cd .../src/third_party/kernel/v$VER/\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ ./chromeos/scripts/kernelconfig editconfig\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"font-size:13.3333330154419px\"\u003eThe exact value for $VER depends on your board as each one is different. You can find that out by seeing what version by running \u003ccode\u003e`emerge-$BOARD -pv virtual/linux-sources`\u003c/code\u003e.\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThis will run 'make menuconfig' for each part of the config. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eYou need to figure out which part your config options appear in, and then make the changes when that config comes up. When it says 'press a key', you have to press \u0026lt;enter\u0026gt;.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Make-a-change-to-the-config-\" /\u003eMake a change to the config \u003c/h2\u003e\r\n\u003cp\u003eRun editconfig to modify each config appropriately using menuconfig and then regenerate the splitconfigs. The editconfig script will run \"make menuconfig\" on each flavor config. Please make appropriate changes for each menuconfig run and the script will generate the correct splitconfig.\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecd /path/to/kernel\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003echromeos/scripts/kernelconfig editconfig # regenerate splitconfig\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Alternative-Method-to-Edit-Config\" /\u003eAlternative Method to Edit Config\u003c/h2\u003e\r\n\r\n\u003cp\u003eThis is a little faster if you know what you're doing:\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eLook for the kernel config option you want to edit\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ grep -rs CONFIG_NETWORK_FILESYSTEMS chromeos/config/\u003cbr /\u003e\r\nchromeos/config/base.config:# CONFIG_NETWORK_FILESYSTEMS is not set\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eNow edit that file \u003ccode\u003echromeos/config/base.config\u003c/code\u003e to change the config like this:\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e# CONFIG_NETPOLL_TRAP is not set\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cs\u003e\u003ccode\u003e# CONFIG_NETWORK_FILESYSTEMS is not set\u003c/code\u003e\u003c/s\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eCONFIG_NETWORK_FILESYSTEMS\u003dy\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eCONFIG_NETWORK_SECMARK\u003dy\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e# CONFIG_NET_9P is not set\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eNow run this to recreate all the configs based on your changes\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0);line-height:26px\"\u003e\u003ccode\u003e$ \u003c/code\u003e\u003c/span\u003e\u003ccode\u003echromeos/scripts/kernelconfig olddefconfig\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eThis will accept the default choices for any new or otherwise unspecified options. If needed you can change them by editing the file on your next run around this method.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eRinse and repeat\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIf you find that during that last step, your configs are disappearing, then you've likely enabled a config without enabling all of its dependencies. You'll need to either 1) track down those dependencies and enable them as well, or 2) Use the editconfig method mentioned above.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Comparing-in-tree-config-to-split-config\" /\u003eComparing in-tree config to split config\u003c/h2\u003e\r\n\u003cp\u003eThis might not be useful, but:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# get full flavour config sorted, without leading #\u003cbr /\u003e\r\nFLAVOUR\u003dchromeos-tegra2 cat chromeos/config/base.config \\\u003cbr /\u003e\r\n   chromeos/config/armel/common.config \\\u003cbr /\u003e\r\n   chromeos/config/armel/$FLAVOUR.flavour.config | \\\u003cbr /\u003e\r\n   grep CONFIG_ | sed \"s/.*CONFIG/CONFIG/\" | sort -u \u0026gt;1.emerge\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# purify .config in the same way\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003emake ARCH\u003d${kernarch} savedefconfig\u003c/code\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# compare\u003cbr /\u003e\r\ndiff 1.emerge defconfig\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Manual-Building\" /\u003eManual Building\u003c/h2\u003e\r\n\u003cp\u003eHere is how to build the kernel yourself manually, from within the chroot.\u003c/p\u003e\r\n\u003cp\u003eMake sure you have done something like:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003eexport B\u003d\"tegra2_seaboard\"\u003cbr /\u003e\r\nexport ARCH\u003darm\u003cbr /\u003e\r\nexport CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi-\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# indicate that you are making kernel changes\u003c/code\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecros_workon --board\u003d$B start sys-kernel/chromeos-kernel-$VER\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eThe exact value for $VER depends on your board as each one is different. You can find that out by seeing what version by running \u003ccode\u003e`emerge-$BOARD -pv virtual/linux-sources`\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eAs you probably know, the \u003ccode\u003ecros_workon start\u003c/code\u003e tells the build system to use your local source install of the official source. Then set up the config:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# set up the .config file\u003cbr /\u003e\r\n./chromeos/scripts/prepareconfig chromeos-tegra2\u003cbr /\u003e\r\nmake olddefconfig\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# edit config\u003cbr /\u003e\r\nmake menuconfig\u003cbr /\u003e\r\n# (make your changes)\u003c/code\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cp\u003eNow, after you make a kernel change, you can simply type \u003ccode\u003emake\u003c/code\u003e as normal:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# build the kernel and modules\u003cbr /\u003e\r\nmake\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# or maybe: build the uImage on an 8 core machine\u003cbr /\u003e\r\nmake -j10 uImage\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# or both!\u003cbr /\u003e\r\nmake \u0026amp;\u0026amp; make uImage\u003c/code\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Generate-a-new-splitconfig-after-adding-new-Kconfig-options\" /\u003eGenerate a new splitconfig after adding new Kconfig options\u003c/h3\u003e\r\n\u003cp\u003eRun olddefconfig to regenerate the splitconfigs. The olddefconfig script will run \"make olddefconfig\" on each flavor config.\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecd ~/trunk/src/third_party/kernel/v$VER\u003cbr /\u003e\r\nchromeos/scripts/kernelconfig olddefconfig # regenerate splitconfig\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-a-new-config\" /\u003eAdding a new config\u003c/h3\u003e\r\n\u003cp\u003eCopy the new config to the appropriate place in the chromeos/config and then run oldconfig\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ecd ~/trunk/src/third_party/kernel/v$VER\u003c/span\u003e\u003cbr /\u003e\r\ncp config.flavour.chromeos-new .config\u003cbr /\u003e\r\nmake ARCH\u003d${ARCH} olddefconfig\u003cbr /\u003e\r\ncp .config chromeos/config/\u0026lt;arch\u0026gt;/\u0026lt;flavour\u0026gt;.flavour.config\u003cbr /\u003e\r\nchromeos/scripts/kernelconfig olddefconfig # regenerate splitconfig\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-can-I-find-the-list-of-flavour-configs\" /\u003eHow can I find the list of flavour configs\u003c/h3\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ecd ~/trunk/src/third_party/kernel/v$VER\u003c/span\u003e\u003cbr /\u003e\r\nfind chromeos/config -name \\*.flavour.config\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-to-regenerate-and-validate-splitconfigs-from-single-config\" /\u003eHow to regenerate and validate splitconfigs from single config\u003c/h3\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ecd ~/trunk/src/third_party/kernel/v$VER\u003c/span\u003e\u003cbr /\u003e\r\ncp \u0026lt;single config\u0026gt; chromeos/config/\u0026lt;arch\u0026gt;/\u0026lt;flavour\u0026gt;.flavour.config\u003cbr /\u003e\r\nchromeos/scripts/kernelconfig olddefconfig\u003cbr /\u003e\r\nchromeos/scripts/prepareconfig \u0026lt;flavour\u0026gt;\u003cbr /\u003e\r\nmake ARCH\u003d${ARCH} oldconfig\u003cbr /\u003e\r\ndiff .config \u0026lt;single config\u0026gt;\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-configuration"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4983378072493616104"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4983378072493616104"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4983378072493616104"}],"author":[{"name":{"$t":"Simon Glass"},"email":{"$t":"sjg@chromium.org"}}],"sites$pageName":{"$t":"kernel-configuration"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8789228368450982389"},"published":{"$t":"2019-05-23T16:25:46.278Z"},"updated":{"$t":"2019-06-03T14:56:06.835Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-06-03T14:56:04.523Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Platform Privacy"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003ci\u003e\u003cfont color\u003d\"#666666\"\u003eFor information on privacy efforts within the Chrome/Chromium browsers, see \u003ca href\u003d\"/\"\u003echromium-privacy\u003c/a\u003e.\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eImproving the privacy of the web includes proposing, discussing and implementing changes to the web platform to preserve the health of the web ecosystem while protecting users and their data. \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThe Chromium team participates in open discussions with other browser vendors, publishers, and ecosystem participants on a variety of topics including privacy.\u003c/span\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe following proposals on web platform privacy have been published by the Chromium team:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://github.com/csharrison/conversion-measurement-api\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eConversion Measurement\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eThis list will be updated as new proposals are published.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/platform-privacy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8789228368450982389"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8789228368450982389"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8789228368450982389"}],"author":[{"name":{"$t":"Vivek Sekhar"},"email":{"$t":"vsekhar@chromium.org"}}],"sites$pageName":{"$t":"platform-privacy"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1532852724421054608"},"published":{"$t":"2016-08-09T16:06:57.437Z"},"updated":{"$t":"2019-05-31T18:48:45.703Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-31T18:48:43.741Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Try out WebView Beta"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eHow to join:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSteps for using WebView Beta, Dev, and Canary has been relocated to the following page: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/prerelease.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/prerelease.md\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cdiv\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-size:medium;line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-WebView-FAQ\" /\u003e\u003cspan style\u003d\"font-size:18.6667px;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;background-color:transparent\"\u003eWebView FAQ\u003c/span\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eThe WebView FAQ has been relocated to the following page: \u003c/font\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/faq.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/faq.md\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cfont size\u003d\"3\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/227494585600465320"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/androidwebview/android-webview-beta"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1532852724421054608"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1532852724421054608"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1532852724421054608"}],"author":[{"name":{"$t":"Sam Birch"},"email":{"$t":"sbirch@chromium.org"}}],"sites$pageName":{"$t":"android-webview-beta"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5179304257198184789"},"published":{"$t":"2019-04-25T15:34:17.720Z"},"updated":{"$t":"2019-05-24T15:38:46.115Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-24T15:38:44.049Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"March 2019"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:42pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eMARCH 2019\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:100%\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:215pt\"\u003e\u003ctd style\u003d\"padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"181\" src\u003d\"https://lh4.googleusercontent.com/bT81a8VO0AgQk_m0F1KqBnoC5oYBcHNHpgknmtbpr3qLjsrHM3F0GE3K20VzUDlXjx47SUe7K1oV0GLC7Xcs1hEfMOc3hKuMCIbwR2XR1hrRBTMB8Q8pTK4EOp5YPIK3e0H6Qh21\" style\u003d\"border:none\" width\u003d\"185\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDegenerate case in computing sign of quaternions. \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"181\" src\u003d\"https://lh3.googleusercontent.com/dvKfGyIqut3spwESpQ5gUXzdfMs8FvL5OndVdmtFSd9tynbci3E1z3xCO3G3lZA2Y2mq9Ypu1dU9SX_3yUjicYe0lGHi5iFKX8FPyVLNyVKARi0xqB0OBofd1vUlusUVi_ZuFrIF\" style\u003d\"border:none\" width\u003d\"185\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 1: Fix quaternion calculations.  Avoid degenerate edge cases.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"181\" src\u003d\"https://lh4.googleusercontent.com/MYDxbzoQPU76BSHi8UQawTmlX9eDDWuEBD7kyjtvQUQv8Gy5_RCbaem7xEdbNAukqTiuyNWRvTJNG4RXp9KQgu_xphSZLuwaHU22Deo6e3T5879Rj-x9Jz8SXuCgl_DNesljbp8o\" style\u003d\"border:none\" width\u003d\"185\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 2: Support 2D matrix decomposition.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eImproved 3D and 2D transform animations\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe have continued to address 2D and 3D matrix decomposition issues that were causing transform animation and interop bugs. Above is one example but 16 more wpt tests are now passing in Chrome. The fact that there are two implementations (in Blink and Skia) of the same matrix operations is not helpful and we are considering options to consolidate them.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis work help identify inconsistencies and inaccuracies in the css-transform specification for which issues have been filed: \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3709\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3710\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3711\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3712\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e4\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3713\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e5\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:100%\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:215pt\"\u003e\u003ctd style\u003d\"padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"291\" src\u003d\"https://lh3.googleusercontent.com/BQeMOUyYU4rbjq7gr7IOZD-LfcTsBwYbnPWF5yfh-rAex7JNjMTeVC8hNQxrsl3Pawcx1y6TOutPkgG2jS5RRYFbI1-_8Du9YqX0uw-V3xpwcBG6sYw6D20VUCjN4POBqf2LdpV3\" style\u003d\"border:none\" width\u003d\"164\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eExisting implementation using scroll events.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"286\" src\u003d\"https://lh5.googleusercontent.com/qP-hDF8ZwIY3DLAxCX4pXhO4Qc3OVVEHHcSnzsjJUP6LgBdCwWG1Kq6yZsNkXRulL8QkYhHoI-WQtl3aEOV4xUeapzwmxxKd7YvyB9PWmPdB2Suo91aD3H69x6X1F_pl133XX8Bm\" style\u003d\"border:none\" width\u003d\"160\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:10pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNew “Buttery Smooth” impl using Animation Worklet and Scroll Timeline.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAMP Origin Trial Updates\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.8;margin-top:6pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAMP animation team has a near complete\u003c/span\u003e\u003ca href\u003d\"https://github.com/ampproject/amphtml/blob/master/extensions/amp-animation/0.1/runners/scrolltimeline-worklet-runner.js\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ere-implementation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e of their\u003c/span\u003e\u003ca href\u003d\"https://ampbyexample.com/visual_effects/basics_of_scrollbound_effects/\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003escrollbound effect\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e system using Scroll Timeline and Animation Worklet. They have identified\u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1TZBb88apJ41Ibi3mued5ZB0Z9YY7h83UjAi2Q9b1fQM/edit#heading\u003dh.eb8fxcagf7ig\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egaps\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in the API which we collaborated on an\u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1XFPgy3g57njeesgJdbVSc2x8vZJQFAJBxUwuHLc3VXs/edit?usp\u003dsharing\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eaction plan\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to address (mainly by proposing changes to Scroll Timeline API). It was also decided to\u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/blink-dev/AZ-PYPMS7EA/kffOspnyBwAJ\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eextend\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the origin trial to allow AMP's new implementation to be gradually turned on for real users - which also helps us learn more about the performance of these features at scale.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.44;margin-top:6pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eHere is a\u003c/span\u003e\u003ca href\u003d\"https://drive.google.com/open?id\u003d1WqNNyJC1r9yUoYTgATlRX4mYIPo8R3yU\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erecording\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e of the\u003c/span\u003e\u003ca href\u003d\"https://amp-article.herokuapp.com/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edemo\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(To run locally enable experimental web platform feature flag and enable relevant AMP experiment using `AMP.toggleExperiment('chrome-animation-worklet')` in devtools console)\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:100%\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"125\" src\u003d\"https://lh6.googleusercontent.com/OyXkbEam5SYQ1dD04AR3HrX-hQ6z2fklO7BTRRPy5ZYFqVPwctNRQbXTcp4JgxA95sPL99cQUfixsSOWmr4g8mdbONwlKX2iN9oMBxAPPGD9Qlc4pkIKxXuYGhh70Pqk2vDaGWL9\" style\u003d\"border:none\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eViz Hit-Testing Surface Layer\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFinch trial is showing improvement over previous Draw Quad version. We are seeing 14%/8%/5% improvements in hit test requests answered in the fast path on \u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations/?sid\u003d7bf43df040ce9f90cbea1e762c5c03d5\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWindows\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e/\u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations/?sid\u003d035b5f6d5f7ca030b7887f5b4e7f6b07\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMacOS\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e/\u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations/?sid\u003de16a589895889a2310b4bc5f4387b43c\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAndroid\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, with 8% regressions on \u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations/?sid\u003d2ffbcd8b59f4a74e05490d98f34cb579\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLinux\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (under investigation). Across all platforms, \u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations/?sid\u003d5a3437665f748a4b4bcc679013900143\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehit testing error rates\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e are lower than 0.05%.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"123\" src\u003d\"https://lh5.googleusercontent.com/PdcNk4yzu3sVovMt1mQcuDwfoinb7N2EwvpdAgdC16SVQbeJOY-9snyuxO48NMCN2K0QrWH3S7uw7VJG-dWxEMJO_7b6Qpl6rrULnaV-garO2ER_s6st0NgQp01PECa9Yc3-HViY\" style\u003d\"border:none\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eCompositor Touch Action\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFinch trial is showing promising \u003c/span\u003e\u003ca href\u003d\"https://uma.googleplex.com/p/chrome/variations?sid\u003d4d04b0905ac90bafd4b63b39754ae20e\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eearly results\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. ScrollBegin latency improves 5% @50pct and 13% @99pct. ScrollUpdate latency improves 1% @50pct and 3% @99pct.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eOff-Main Paint Worklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe made good progress by completing implementation of multiple sub-components: \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1426015\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erasterization\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1479658\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eraster-caching logic\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1497032\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003elookup\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Work is in progress for \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1495445\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edispatch logic\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and a new approach to share data between blink and cc for paint info (\u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1497217\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1504229\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1506653\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1506818\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e4\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e).\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet is now fully \u003c/span\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d791280\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003easynchronous\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in CC with proper scheduling in place. With \u003c/span\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d915352\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehelp\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e from Microsoft engineers our tests have been upstreamed to \u003c/span\u003e\u003ca href\u003d\"https://wpt.fyi/results/animation-worklet?label\u003dmaster\u0026amp;product\u003dchrome%5Bexperimental%5D\u0026amp;product\u003dedge\u0026amp;product\u003dfirefox%5Bexperimental%5D\u0026amp;product\u003dsafari%5Bexperimental%5D\u0026amp;aligned\u0026amp;q\u003danimation-worklet\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eweb-platform-tests\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and most critical flakiness issues are resolved. Specification has been updated (\u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/commit/3c1cd1b3babc49a92d7a5079f9de77df67d06775#diff-6547a8c38ca0bdc51fd63edeaa4b66b3\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/commit/93ab72f8abee1ac008eb4b5292265633387381fc#diff-6547a8c38ca0bdc51fd63edeaa4b66b3\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/commit/cf1a69a4c9dd165f53df7ba7d68c329287ab2659#diff-6547a8c38ca0bdc51fd63edeaa4b66b3\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e) and \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3ctag/design-reviews/issues/349\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTAG review\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e requested. Aiming to ship without Scroll Timeline in M75.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Updates | March 2019\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" style\u003d\"font-size:13.3333px\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(66,133,244);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/march-2019"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5179304257198184789"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5179304257198184789"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5179304257198184789"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"march-2019"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5832213614770460601"},"published":{"$t":"2019-04-25T15:36:09.169Z"},"updated":{"$t":"2019-05-24T15:38:40.618Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-24T15:38:38.306Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"April 2019"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAPRIL 2019\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"359\" src\u003d\"https://lh4.googleusercontent.com/e4d0yeYg2osuLzXs4PZ-Mocx7ILQEqgXJKvI2K5Lopqki3LxuCKFywsPcH-9JDiVOYCB4kF2I_zqkY3mGDDjBrPibOst19SBWkmVM3a0DagRZYZgm6UB5jz0k-PujynP5S8w1YS1\" style\u003d\"border:none\" width\u003d\"462\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eIt looks the same as you would see in Chrome Stable, but it's totally running off-thread. We promise!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eOff-Main Paint Worklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWork continues on our efforts to take Paint Worklets off the main thread and run them from the compositor. With the \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1525160\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eblink → cc communication\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and the worklet thread\u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1531153\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e dispatching logic\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e landed, we are able to render a Paint Worklet off the main thread for the first time! There's still some way to go, but this is a vital step towards smoothly animating Paint Worklets.\u003c/span\u003e\u003c/p\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"294\" /\u003e\u003ccol width\u003d\"278\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans,sans-serif;color:rgb(105,93,70);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"166\" src\u003d\"https://lh5.googleusercontent.com/P0KFfWlfC7wj43S6F4IlkfQ5poIbTEFbtIxQWxRT-CEpYFR-0A-JfdpZzkE01Qw3I_TiiNB8KngKzhPQM-DCzweaW-escsvEDD3PMXnUFJxnQXv-a3ajsMTP1nDv0BukWpkEufeL\" style\u003d\"border:none\" width\u003d\"227\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll Snap\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWith sunyunjia@ sadly leaving the team, girard@ took over finishing up the work on scroll snap. Initial ramp-up went well; discovered \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/944184\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ean issue\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e with scrollbar arrow buttons and scroll snap, file a \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/issues/3752\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003espec bug\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/csswg-drafts/commit/09e040f05e12bb4c303d5839e0ceee3f6bf58c67\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epatched the spec\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and Gene is now working on \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1534988\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ea fix\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for the Chrome implementation.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"172\" src\u003d\"https://lh6.googleusercontent.com/qTkpiW1DKDbFNM12EZdAmQ7OgdOCE8ZQPZtvqIb6Za4WC-mWlNDCmaQ3zc5Bdd1R2uEaD-dvClmRRVblyw5ChI_lRLJ3uLR6GhDp-wAYSc48ziHdOSY8F5MqRzFAF2njgYJycyle\" style\u003d\"border:none\" width\u003d\"172\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eShipping more of Web Animations!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLong overdue, some more parts of the Web Animations API are going to be shipping soon - \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/1EQKF7il48U\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimationEffect and (some of) KeyframeEffect\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and the \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/UMxgGkxhdCo\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation constructor\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBlinkOn is coming!\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOur team has two presentations planned for BlinkOn 10. We also have planned a collaboration session with Microsoft engineers around animations and related topics.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBlinkGenPropertyTrees\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe continue to support the paint-team's project to move property tree generation to Blink instead of the compositor. This has required significant changes in how element ids are treated in composited animations, and has taught us about where our tests fail to catch regressions.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:6pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"92\" src\u003d\"https://lh4.googleusercontent.com/SMf7AoFH-HS2DqUKTgH4zFTnynOaoDXioRMPyeFiO-I5bJFrT2X1NiaB6YeetcUQ0BOtLeIjwNGOWF9EkzBliu4oY1Nc6C3jZdY6XN_gVMQHA9JK9SJ3u_c375BOAZPzXimTsJKn\" style\u003d\"border:none\" width\u003d\"596\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eViz Hit-Testing Surface Layer\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTackling blocking issues preventing promotion of new version to 100% of Beta users. LTHI::BuildHitTestData was reduced from ~400ms to 0.3ms in a pathological case (6000+ layers on a page), and a BlinkGenPropertyTrees masking bug was resolved. Working on tackling low fast-path rate on Linux; multiple fixes in progress which are expected to bring it in line with other platforms.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"127\" src\u003d\"https://lh5.googleusercontent.com/BGpN4LK3CTdcACVHZk4Obno9IbfAq1oSy2a3-f-uUuEwkn0_6bmAigxmZgukpJtcPPZvPI2EnKSdcgBiV4yxBhKyCwvVpw0vkhJI8An_fLZS89nZfktPFRl2DErvnik2NGYucPPZ\" style\u003d\"border:none\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet - the road to shipping\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation Worklet continues to make progress on its road to shipping. Notable features this sprint included finally making fully-asynchronous Animation Worklets as \u003c/span\u003e\u003ca href\u003d\"https://drive.google.com/file/d/1jF3bQlFKkbv4Sz7Q6r2rPDGxewXdw0Zl/view\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebuttery smooth and jank free\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e as they deserve to be (multiple weeks of work, well done kevers@ and flackr@!), \u003c/span\u003e\u003ca href\u003d\"https://crrev.com/386583bbe5a57761ff36bf925066f281b57d9d26\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eproper i18 support\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for naming worklets, and progressing on \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1488312\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esupport for stateful animations\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. The Animation Worklet Origin Trial has been \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/AZ-PYPMS7EA/Fo76_FuFBAAJ\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eextended until M75\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to gather more data as AMP rolls out its AnimationWorklet-based solution to all users!\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | April 2019\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" style\u003d\"font-size:13.3333px\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(66,133,244);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/april-2019"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5832213614770460601"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5832213614770460601"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5832213614770460601"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"april-2019"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8189903631156626817"},"published":{"$t":"2019-04-29T17:06:06.954Z"},"updated":{"$t":"2019-05-24T15:38:30.771Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-24T15:38:28.874Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"April 2019, Volume II"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"611\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:54pt\"\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eApril 2019, Volume II\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eArchives: \u003c/span\u003e\u003ca href\u003d\"http://go/animations-team-highlights\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team-highlights\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(0,0,0);border-top:1pt solid rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"610\" /\u003e\u003ccol width\u003d\"102\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"367\" src\u003d\"https://lh3.googleusercontent.com/ijzv1FoeaoQqmakoVD-22LcixO6d-o_mKKFTGwYa3JKIFBecPJtDZjHLnSTEBFBCVdcQxHg2PUAToBolahoOUz0-DmLVOi1rZjT_mksxuZA20sPrkULJVO7H3SeYSyRxA_4uIt2x\" style\u003d\"border:none\" width\u003d\"596\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOne DIV, \"7 lines\" of script. Done! (Animation from LottieFiles: \u003c/span\u003e\u003ca href\u003d\"https://lottiefiles.com/433-checked-done\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://lottiefiles.com/433-checked-done\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:8pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eLottie in a PaintWorklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003ca href\u003d\"https://airbnb.design/lottie/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLottie\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is a popular framework from AirBnB that renders After Effects animations, allowing designers to create rich complex animations. Its \u003c/span\u003e\u003ca href\u003d\"https://github.com/airbnb/lottie-web\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eweb implementation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, however, is not very performant. This sprint, Rob Flack (flackr@) prototyped a port of the Lottie renderer to a PaintWorklet - driven by a standard Web Animation for input progress. Not only does this bring richer devtools integration, but with the ongoing \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1USTH2Vd4D2tALsvZvy4B2aWotKWjkCYP5m0g7b90RAU/edit?ts\u003d5bb772e1#heading\u003dh.2zu1g67jbavu\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOff-Thread PaintWorklet\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e effort we will soon be able to render Lottie animations performance-isolated from the main thread!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:100%\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:26pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"128\" src\u003d\"https://lh4.googleusercontent.com/U9zrtaB0y4-AB2jh3ZIpZBM4h6Syh5L4ZqasUgSLmdez7iBL0r4TkUvBJczJGh7usdsZaoxdrPtLE2jMuYDa-c103TacHIZ2ghex6xyAaF9dhkTCX8dIsjTQu2iYdtcc1wD6Uivp\" style\u003d\"border:none\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eViz Hit-Testing - Linux Performance\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eXianda (sunxd@) sadly left the team this sprint, but not before he followed through on\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehis promise to bring the fast-path rate on Linux up to the same standard as other platforms.\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe goal was to have 80% of hittests use the\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efast path - Xianda overdelivered as usual with a fantastic 93% fast-path rate!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"128\" src\u003d\"https://lh5.googleusercontent.com/DYE-WxgyKi-r-aZ-7PNd8z9cWxufESkHmzVcqugM-wHBKU5pUjXqz2aT4v7XHQaDWXiRa6ZK0eqJKsQXkhskzkksQGQZ-yR_mmVnVFHU2IjEGiAqt-N9TrVpcL-8sZWFtxjmneD6\" style\u003d\"border:none\" width\u003d\"283\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eStateful Animation Worklet\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003ca href\u003d\"https://drafts.css-houdini.org/css-animationworklet-1/#stateful-animator-desc\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStateful Animators\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e enable developers to keep local state in their Animation Worklet to perform richer effects (e.g. velocity based animations). Yi (yigu@) has lead the spec work on these, and this sprint he landed the corresponding code.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBlinkOn has come - and gone!\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTwo thirds of the Animations team decamped to Toronto for BlinkOn, spending two days listening to (and giving) talks, syncing with colleagues from around the world, and getting to know some of our new collaborators from Microsoft. Both Stephen's \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/presentation/u/1/d/1WrzDN_PiKBfOVUrrbOV8gHQO-ODN0gdCpWE4xMYv29c/edit?usp\u003ddrive_web\u0026amp;ouid\u003d105513761242358226829\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOff Main Thread CSS Paint\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and Majid's \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/presentation/d/1BCEbLCg-o_Ko65byel5QGnO7Cwf5aPZPjqnnMNbbA5E/edit\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEvent Delegation to Worker and Worklets\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e talks were well attended and well received.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Animations - Moar Interop\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eKevin (kevers@) has been hard at work fixing bugs in our Web Animations implementation - over 50% of the \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/772407\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eknown WPT failures\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e are now fixed! This sprint has seen a focus on timing issues, with plenty of nasty floating-point boundary case bugs to squish!\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt;text-align:center\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cimg height\u003d\"286\" src\u003d\"https://lh3.googleusercontent.com/5vUZFWkmaAi__ErtI9EwMBbnBx7aRTDa74k33Ya0BQ6hLcTQU5TGX4nB6OzlJWXcdY17QGEiZi8ADo5xXF5o0EtnCxx_Naw9Fj0dGMIT8GUvCwoM3G7DLMpvzOA_7XuBnYX_NgJz\" style\u003d\"border:none\" width\u003d\"353\" /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll Snap - supporting AMP\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAMP team are excited to use scroll snap for their image carousel, but need paginated behavior. We previously implemented the \u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-snap-stop\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003escroll-snap-stop\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e feature to enable this. This sprint they \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/823998#c15\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ereported a bug\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e where they were able to 'break' the snapping and cause their content to go flying! Majid leapt into action: \u003c/span\u003e\u003ca href\u003d\"https://drive.google.com/file/d/1Jlb1IlQ66-JbCi1lBn-L0zhDBoiZF_Qb/view\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ereproducing\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, diagnosing, and \u003c/span\u003e\u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1572286\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efixing\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the bug. This should clear the way for AMP to roll out scroll snap, and we are excitedly \u003c/span\u003e\u003ca href\u003d\"https://www.chromestatus.com/metrics/css/timeline/popularity/499\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewatching our metrics\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"104\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"306\" /\u003e\u003ccol width\u003d\"100\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Animations\u003c/span\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Highlights | April 2019, Volume II\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-right:1pt solid rgb(255,255,255);border-bottom:1pt solid rgb(255,255,255);border-top:1pt solid rgb(0,0,0);padding:5pt\"\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-align:right\"\u003e\u003ca href\u003d\"http://go/animations-team\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:9pt;font-family:Roboto,sans-serif;color:rgb(66,133,244);background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ego/animations-team\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(255,255,255);padding:5pt\"\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4931787337431502445"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/highlights-archive/april-2019-volume-ii"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8189903631156626817"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8189903631156626817"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8189903631156626817"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"april-2019-volume-ii"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7615454063182726722"},"published":{"$t":"2014-12-10T09:52:01.946Z"},"updated":{"$t":"2019-05-23T20:06:53.345Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-23T20:06:50.557Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Web Platform Security"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\r\n Developers should have the tools necessary to defend their creations\r\n against the wide spectrum of maliciousness thrown at them on a daily\r\n basis. We design and implement platform-level features that enable a\r\n robust defense, and work in standards bodies to get them in front of\r\n as many developers as possible.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Features-we-re-working-on\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eFeatures we're working on\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Content-Security-Policy\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eContent Security Policy\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Subresource-Integrity\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eSubresource Integrity\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upgrade-Insecure-Requests\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eUpgrade Insecure Requests\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mixed-Content\"\u003e\u003cstrong\u003e1.4 \u003c/strong\u003eMixed Content\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cookies\"\u003e\u003cstrong\u003e1.5 \u003c/strong\u003eCookies\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Credential-Management\"\u003e\u003cstrong\u003e1.6 \u003c/strong\u003eCredential Management\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Referrer-Policy\"\u003e\u003cstrong\u003e1.7 \u003c/strong\u003eReferrer Policy\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Secure-Contexts\"\u003e\u003cstrong\u003e1.8 \u003c/strong\u003eSecure Contexts\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Clear-Site-Data\"\u003e\u003cstrong\u003e1.9 \u003c/strong\u003eClear Site Data\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Entry-Point-Regulation\"\u003e\u003cstrong\u003e1.10 \u003c/strong\u003eEntry Point Regulation\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Come-work-with-us-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eCome work with us!\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Features-we-re-working-on\" /\u003eFeatures we're working on\u003c/h2\u003e\r\n \r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Content-Security-Policy\" /\u003eContent Security Policy\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've shipped \u003ca href\u003d\"http://www.w3.org/TR/CSP2/\" rel\u003d\"nofollow\"\u003eContent Security\r\n Policy Level 2\u003c/a\u003e as of Chrome 42, and we're starting to put together\r\n the vision for the next iteration of the standard. You can follow\r\n along at\r\n \u003ca href\u003d\"https://github.com/w3c/webappsec-csp/\" rel\u003d\"nofollow\"\u003ehttps://github.com/w3c/webappsec-csp\u003c/a\u003e.\r\n Firefox has support for most of CSP2 as well.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Subresource-Integrity\" /\u003eSubresource Integrity\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've shipped \u003ca href\u003d\"http://www.w3.org/TR/SRI/\" rel\u003d\"nofollow\"\u003eSubresource\r\n Integrity\u003c/a\u003e as of Chrome 46. This feature should also be shipping in\r\n Firefox ~43, which is exciting to see.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Upgrade-Insecure-Requests\" /\u003eUpgrade Insecure Requests\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've shipped \u003ca href\u003d\"http://www.w3.org/TR/upgrade-insecure-requests/\" rel\u003d\"nofollow\"\u003eUpgrade\r\n Insecure Requests\u003c/a\u003e as of Chrome 44. This feature should also be shipping in\r\n Firefox 42, which will give us a fairly broad base of support.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Mixed-Content\" /\u003eMixed Content\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've been steadily tightening our \u003ca href\u003d\"http://www.w3.org/TR/mixed-content/\" rel\u003d\"nofollow\"\u003eMixed\r\n Content\u003c/a\u003e blocking over the last ~18 months. The specification has\r\n broad approval from other vendors, who are generally aligning with Chrome's\r\n behavior over time.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Cookies\" /\u003eCookies\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We have a number of cookie-related proposals floating around that we're\r\n building support for in the IETF's HTTPbis group:\r\n \u003c/p\u003e\r\n\r\n \r\n\u003cul\u003e\r\n \u003cli\u003e\r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://tools.ietf.org/html/draft-west-leave-secure-cookies-along\" rel\u003d\"nofollow\"\u003eDeprecating\r\n modification/creation of \"Secure\" cookies on non-secure origins\u003c/a\u003e strengthen the security properties of cookies with the Secure attribute.\r\n \u003c/p\u003e\r\n\u003c/li\u003e\r\n \u003cli\u003e\r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00\" rel\u003d\"nofollow\"\u003eSameSite\u003c/a\u003e cookies provide a defense against various forms of CSRF\r\n \u003c/p\u003e\r\n\u003c/li\u003e\r\n \u003cli\u003e\r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://tools.ietf.org/html/draft-west-cookie-prefixes\" rel\u003d\"nofollow\"\u003eCookie Prefixes\u003c/a\u003e\r\n might provide a mitigation for the integrity and confidentiality\r\n limitations of cookies' delivery model.\r\n \u003c/p\u003e\r\n\u003c/li\u003e\r\n \u003cli\u003e\r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://tools.ietf.org/html/draft-west-origin-cookies\" rel\u003d\"nofollow\"\u003eOrigin cookies\u003c/a\u003e\r\n are a slightly more robust model than the prefix proposal, but also seem\r\n less likely to be adopted, so. Belts and suspenders.\r\n \u003c/p\u003e\r\n\u003c/li\u003e\r\n \u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Credential-Management\" /\u003eCredential Management\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We're working with Chrome's password manager team to define an imperative\r\n API for interaction with the browser's stored credentials. The spec is\r\n progressing nicely at \u003ca href\u003d\"https://w3c.github.io/webappsec-credential-management/\" rel\u003d\"nofollow\"\u003ehttps://w3c.github.io/webappsec-cred»\r\n and the feature is mostly implemented behind\r\n \u003ccode\u003echrome://flags/#enable-credential-manager-api\u003c/code\u003e.\r\n \u003c/a\u003e\u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Referrer-Policy\" /\u003eReferrer Policy\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://w3c.github.io/webappsec-referrer-policy/\" rel\u003d\"nofollow\"\u003eReferrer Policy\u003c/a\u003e\r\n shipped in Chrome a long time ago, and the new bits we've added to the spec\r\n are trickling out over time.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We need to do some refactoring in order to consistently apply referrer policy\r\n for redirects (basically hoisting the parsing and processing up out of Blink\r\n and into the network stack). Hopefully we'll get that done in Q4 (2015).\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Secure-Contexts\" /\u003eSecure Contexts\u003c/h3\u003e\r\n \r\n \r\n\u003cp\u003e\r\n \u003ca href\u003d\"https://w3c.github.io/webappsec-secure-contexts/\" rel\u003d\"nofollow\"\u003eSecure Contexts\u003c/a\u003e\r\n underlies our commitment to\r\n \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/prefer-secure-origins-for-powerful-new-features\"\u003eprefer secure origins for powerful new features\u003c/a\u003e. We've shipped the concept of a \"secure context\" in Chrome, and are working over\r\n time to \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins\"\u003edeprecate a set of APIs in insecure contexts\u003c/a\u003e. \u003ccode\u003egetUserMedia()\u003c/code\u003e\r\n is unavailable over HTTP as of Chrome 47, and we've got our eye on geolocation\r\n next.\r\n \u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Clear-Site-Data\" /\u003eClear Site Data\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've specified and implemented a feature to allow developers to clear out the data a browser\r\n has stored for their origin at\r\n \u003ca href\u003d\"https://w3c.github.io/webappsec-clear-site-data/\" rel\u003d\"nofollow\"\u003ehttps://w3c.github.io/webappsec-clear-site-data/\u003c/a\u003e.\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\r\n\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Entry-Point-Regulation\" /\u003eEntry Point Regulation\u003c/h3\u003e\r\n\r\n \r\n\u003cp\u003e\r\n We've specified EPR as a defense against CSRF, and hope to get to a prototype\r\n implementation soonish.(this hasn't made progress in a few years)\u003c/p\u003e\r\n\r\n\u003cdiv style\u003d\"background:#eee;border:1px solid #999;padding:2em\"\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Come-work-with-us-\" /\u003eCome work with us!\u003c/h2\u003e\r\n\r\n\u003cp\u003e\r\n If any of the above work resonates with you, come help us! We're hiring in Munich,\r\n Germany, which is \u003ca href\u003d\"https://www.google.com/about/careers/locations/munich/\"\u003ea wonderful place to work indeed\u003c/a\u003e. There's a \u003ca href\u003d\"https://www.google.com/about/careers/search#!t\u003djo\u0026amp;jid\u003d43144\u0026amp;\"\u003egeneric software\r\n engineering job description\u003c/a\u003e, but the best way to get noticed is probably to ping\r\n \u003ca href\u003d\"https://twitter.com/mikewest\" rel\u003d\"nofollow\"\u003e@mikewest\u003c/a\u003e on Twitter, or drop him an email at\r\n \u003ca href\u003d\"mailto:mkwst@google.com\"\u003emkwst@google.com\u003c/a\u003e.\r\n\u003c/p\u003e\r\n\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/owp"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7615454063182726722"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7615454063182726722"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7615454063182726722"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"owp"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4586464219309092386"},"published":{"$t":"2010-12-10T09:26:28.877Z"},"updated":{"$t":"2019-05-23T06:33:51.309Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-23T06:33:49.017Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium Privacy"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-can-I-get-involved-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eHow can I get involved?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Privacy-Reviews\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePrivacy Reviews\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Additional-Information-on-Chromium-Google-Chrome-and-Privacy\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eAdditional Information on Chromium, Google Chrome, and Privacy\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\r\n\u003c/div\u003eOur promise: \u003ci\u003eChromium provides users full transparency and control over the information managed by the browser.\u003c/i\u003e\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFurthermore, we’re constantly trying to improve privacy aspects of your browsing experience by implementing new innovative privacy features.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-can-I-get-involved-\" /\u003eHow can I get involved?\u003c/h3\u003e\r\n\u003cdiv\u003eIf you discover a privacy issue, e.g. a behavior where your personal information is not adequately protected, or used in an non-transparent or unexpected fashion, or bugs related to existing privacy features such as the content settings, please \u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry?template\u003dPrivacy%20issue\"\u003efile a bug\u003c/a\u003e in our public bug tracker.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you want to report a privacy issue that contains e.g. personal information, or other sensitive data, please file a bug using the \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/entry?template\u003dPrivacy+issue+%28confidential%29\"\u003econfidential template\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFor general discussions, please post to the \u003ca href\u003d\"http://dev.chromium.org/developers/technical-discussion-groups\"\u003etechnical discussion forums\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cul /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Privacy-Reviews\" /\u003ePrivacy Reviews\u003c/h3\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo ensure users maintain a consistent way to control their experience with the web, new privacy relevant features are required to undergo a privacy review. Through these reviews, developers receive feedback on how to improve user control and over how Chromium handles user data.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Additional-Information-on-Chromium-Google-Chrome-and-Privacy\" /\u003eAdditional Information on Chromium, Google Chrome, and Privacy\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFeatures that communicate with Google made available through the compilation of code in Chromium are subject to the \u003c/span\u003e\u003ca href\u003d\"http://www.google.com/policies/privacy/\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Privacy Policy\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdditionally, the \u003c/span\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/privacy.html\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Chrome Privacy Notice\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e describes the privacy practices that are specific to the Google Chrome family of products. If you want to learn more about Google Chrome's privacy features you can also check out the \u003c/span\u003e\u003ca href\u003d\"https://www.google.com/chrome/browser/features.html#privacy\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(71,18,100);vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Chrome Privacy landing page\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e and the \u003c/span\u003e\u003ca href\u003d\"http://www.google.com/intl/en/landing/chrome/google-chrome-privacy-whitepaper.pdf\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(71,18,100);vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Chrome Privacy Whitepaper\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e which describes what information is transmitted to Google and why, as well as how to disable certain features in Google Chrome which affect your privacy.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4852676552341181359"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-privacy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4586464219309092386"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4586464219309092386"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4586464219309092386"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"chromium-privacy"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7287758369562761496"},"published":{"$t":"2019-05-22T19:38:32.243Z"},"updated":{"$t":"2019-05-22T19:38:32.276Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T19:38:32.243Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"legacy_shape.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7287758369562761496"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/legacy_shape.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7287758369562761496"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7287758369562761496"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7287758369562761496"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7287758369562761496"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3167715156676306800"},"published":{"$t":"2019-05-22T19:38:23.771Z"},"updated":{"$t":"2019-05-22T19:38:23.835Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T19:38:23.771Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ng_shape.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3167715156676306800"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/ng_shape.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3167715156676306800"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3167715156676306800"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3167715156676306800"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3167715156676306800"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/211839749924391470"},"published":{"$t":"2019-05-22T18:13:30.427Z"},"updated":{"$t":"2019-05-22T18:35:10.802Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:35:10.789Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ng_dlig_jp.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/211839749924391470"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/ng_dlig_jp.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/211839749924391470"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/211839749924391470"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/211839749924391470"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/211839749924391470"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2164449567255264407"},"published":{"$t":"2019-05-22T18:17:34.061Z"},"updated":{"$t":"2019-05-22T18:35:05.989Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:35:05.966Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"legacy_dlig_jp.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2164449567255264407"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/legacy_dlig_jp.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2164449567255264407"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2164449567255264407"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2164449567255264407"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2164449567255264407"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/927329727205545724"},"published":{"$t":"2019-05-22T18:13:45.137Z"},"updated":{"$t":"2019-05-22T18:13:45.167Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:45.137Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"kern_legacy.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/927329727205545724"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/kern_legacy.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/927329727205545724"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/927329727205545724"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/927329727205545724"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/927329727205545724"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4359376810450823308"},"published":{"$t":"2019-05-22T18:13:37.237Z"},"updated":{"$t":"2019-05-22T18:13:37.261Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:37.237Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"kern-ng.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4359376810450823308"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/kern-ng.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4359376810450823308"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4359376810450823308"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4359376810450823308"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4359376810450823308"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7217917815658936315"},"published":{"$t":"2019-05-22T18:13:22.681Z"},"updated":{"$t":"2019-05-22T18:13:22.712Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:22.681Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ng_ar_wrap.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7217917815658936315"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/ng_ar_wrap.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7217917815658936315"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7217917815658936315"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7217917815658936315"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7217917815658936315"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8404548616081713188"},"published":{"$t":"2019-05-22T18:13:14.309Z"},"updated":{"$t":"2019-05-22T18:13:14.350Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:14.309Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"legacy_ar_wrap.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8404548616081713188"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/legacy_ar_wrap.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8404548616081713188"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8404548616081713188"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8404548616081713188"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8404548616081713188"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3864291861239786647"},"published":{"$t":"2019-05-22T18:13:08.387Z"},"updated":{"$t":"2019-05-22T18:13:08.414Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:08.387Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"legacy_float_overlap.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3864291861239786647"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/legacy_float_overlap.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3864291861239786647"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3864291861239786647"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3864291861239786647"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3864291861239786647"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1960649138631571413"},"published":{"$t":"2019-05-22T18:13:00.155Z"},"updated":{"$t":"2019-05-22T18:13:00.197Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:13:00.155Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ng_float_overlap.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1960649138631571413"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/ng_float_overlap.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1960649138631571413"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1960649138631571413"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1960649138631571413"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1960649138631571413"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3912123591776376734"},"published":{"$t":"2019-05-22T18:12:51.116Z"},"updated":{"$t":"2019-05-22T18:12:51.148Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:12:51.116Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"legacy_float_margin.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3912123591776376734"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/legacy_float_margin.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3912123591776376734"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3912123591776376734"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3912123591776376734"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3912123591776376734"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1972346602510660182"},"published":{"$t":"2019-05-22T18:12:42.412Z"},"updated":{"$t":"2019-05-22T18:12:42.462Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-22T18:12:42.412Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ng_float_margin.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1972346602510660182"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1462653788714829955"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/layoutng/ng_float_margin.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1972346602510660182"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1972346602510660182"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1972346602510660182"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1972346602510660182"}],"author":[{"email":{"$t":"eae@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2653725092746037436"},"published":{"$t":"2015-12-01T18:52:27.299Z"},"updated":{"$t":"2019-05-17T21:56:47.172Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-02T22:41:53.349Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"mus+ash"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003emus+ash (pronounced \"mustash\") is a project to separate the window management and shell functionality of ash from the chrome browser process. The benefit is performance isolation for system components outside of the browser, and a sharper line between what components are considered part of the ChromeOS UX and what are part of the browser. mus+ash is built on top of Mandoline UI Service (\"Mus\") and the Ash system UI and window manager.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eContact\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"mailto:mustash-dev@chromium.org\"\u003emustash-dev@chromium.org\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eSchedule/Milestone\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:212.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eMilestone\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:471.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eDescription\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:305.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eCrbug Label\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:424.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eTarget Date\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:212.01px;height:89.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWindow Service 2 \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:471.01px;height:89.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe window service runs as part of the ash process, instead of in a separate process. This allows us to write small apps the use the window service mojo APIs, as preparation for making the very large chrome browser use those APIs..\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:305.01px;height:89.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-WS2\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProj-Mash-WS2\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:424.01px;height:89.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eQ2/3 2018\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:212.01px;height:61.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eKeyboard Shortcut Viewer \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:471.01px;height:61.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMigrating KSV into a separate app using the window service mojo APIs from above.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:305.01px;height:61.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003d+Proj%3DMash-KSV\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProj-Mash-KSV\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:424.01px;height:61.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eQ3 2018 (M69 Beta, M70 Stable)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:212.01px;height:126.01px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSingle Process Mash \u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:471.01px;height:126.01px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAsh header refactoring to support making single process Mash work. Allows chrome browser to use the window service APIs, but still has ash and browser in a single process. This lets us exercise very complex window APIs without having to finish all the ash / browser decoupling.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:305.01px;height:126.01px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-SingleProcess+\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProj-Mash-SingleProcess\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:424.01px;height:126.01px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eQ4 2018\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:212.01px;height:81.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMulti Process Mash\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:471.01px;height:81.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAsh header refactoring to support making ash and the browser run in separate processes. This is the end goal of the mustash project.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:305.01px;height:81.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-MultiProcess\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProj-Mash-MultiProcess\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:424.01px;height:81.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:14.6667px;white-space:pre-wrap\"\u003eQ2/Q3 2019\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eBug Tracking\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1wiTlRVvSsINYa61An1XywU9TuewWCLupyDV_u9Z4jkw/edit#heading\u003dh.iupkzhopjke8\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eBug Tracking Process\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eLabel Name\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eUse\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLabel for tracking all Mustash related issues (bugs, features)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-WS2\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash-WS2\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:14.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTracking Window Service 2 work\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:17.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-KSV\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash-KSV\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:17.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTracking KSV migration\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:17.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-SingleProcess\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash-SingleProcess\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:17.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTracking ash refactoring support mash in single process\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:46pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:45.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-MultiProcess\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash-MultiProcess\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:45.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTracking ash refactoring support mash in multi process\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:46pt\"\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:173.01px;height:45.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dProj%3DMash-Cleanup\u0026amp;colspec\u003dID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dids\"\u003eProj-Mash-Cleanup\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);padding:5pt;width:416.01px;height:45.0104px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLabel for tracking clean up tasks.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eLinks\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/d/msg/chromium-dev/stof4wmbEDg/bhvWa-PrFQAJ\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eIntent to Implement\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e on chromium-dev with high level tactical details\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dmustash\" style\u003d\"background-color:transparent;font-size:10pt\" target\u003d\"_blank\"\u003eBugs\u003c/a\u003e\u003c/li\u003e\u003cli\u003eNotes in \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/master/ash/README.md\"\u003e//ash/README.md\u003c/a\u003e\u003c/li\u003e\u003cli\u003eGooglers: See \u003ca href\u003d\"http://go/mustash\" rel\u003d\"nofollow\"\u003ego/mustash\u003c/a\u003e and linked documents\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eBuild Instructions\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003emus+ash builds only for Chrome OS (either for device or on Linux with target_os\u003d\"chromeos\"). It requires aura and toolkit_views. There are no special build flags other than target_os.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eBuild chrome:\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eautoninja -C out/foo chrome\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eRun\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eout/foo/chrome --enable-features\u003dMash\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBy default, each service will run in its own process, including chrome and all of chrome's renderers.\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/mus-ash"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2653725092746037436"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2653725092746037436"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2653725092746037436"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"mus-ash"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5298602386326319250"},"published":{"$t":"2019-04-26T19:06:48.905Z"},"updated":{"$t":"2019-05-17T15:37:08.190Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T15:37:08.190Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5298602386326319250"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5298602386326319250"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5298602386326319250"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"Lenovo%20500e%20Chromebook%202nd%20Gen\"\u003eLenovo 500e Chromebook 2nd Gen\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Phaser360S"},{"index":"E","name":"Board name(s)","$t":"Octopus"},{"index":"F","name":"Base board","$t":""},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2872704647164361396"},"published":{"$t":"2019-04-26T19:02:28.247Z"},"updated":{"$t":"2019-05-17T15:37:00.525Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T15:37:00.525Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2872704647164361396"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2872704647164361396"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2872704647164361396"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"Lenovo%20100e%20Chromebook%202nd%20Gen\"\u003eLenovo 100e Chromebook 2nd Gen (Intel)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Phaser"},{"index":"E","name":"Board name(s)","$t":"Octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/25205233346186963"},"published":{"$t":"2019-04-26T19:05:30.143Z"},"updated":{"$t":"2019-05-17T15:36:51.848Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T15:36:51.847Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/25205233346186963"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/25205233346186963"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/25205233346186963"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"Lenovo%20300e%20Chromebook%202nd%20Gen%20(Intel)\"\u003eLenovo 300e Chromebook 2nd Gen (Intel)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Phaser360"},{"index":"E","name":"Board name(s)","$t":"Octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8574486337685029675"},"published":{"$t":"2019-05-17T09:03:37.086Z"},"updated":{"$t":"2019-05-17T15:30:51.007Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T15:30:51.007Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8574486337685029675"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8574486337685029675"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8574486337685029675"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-30"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/Tablets/ASUS-Chromebook-Tablet-CT100PA/\"\u003eASUS Chromebook Tablet CT100\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Dumo"},{"index":"E","name":"Board name(s)","$t":"scarlet"},{"index":"F","name":"Base board","$t":"scarlet"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"RK3399"},{"index":"K","name":"Form Factor","$t":"Chromeblet"},{"index":"L","name":"First Release","$t":"R73"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5347242109176174534"},"published":{"$t":"2017-09-12T21:29:27.312Z"},"updated":{"$t":"2019-05-17T09:07:12.039Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T09:07:12.039Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5347242109176174534"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347242109176174534"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347242109176174534"}],"author":[{"name":{"$t":"Jack Huang"},"email":{"$t":"jachuang@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2017-09-01"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/Laptops/ASUS-Chromebook-Flip-C101PA/\"\u003eAsus Chromebook Flip C101PA\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Bob"},{"index":"E","name":"Board name(s)","$t":"Bob"},{"index":"F","name":"Base board","$t":"gru"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"RK3399"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R58"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Hinge Port"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1917061671829815159"},"published":{"$t":"2019-05-17T09:00:50.471Z"},"updated":{"$t":"2019-05-17T09:04:27.595Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T09:04:27.595Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1917061671829815159"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1917061671829815159"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1917061671829815159"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-01-18"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/Laptops/ASUS-Chromebook-C403NA/\"\u003eASUS Chromebook C403\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"babymako"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4616219765354695639"},"published":{"$t":"2019-05-17T08:59:32.910Z"},"updated":{"$t":"2019-05-17T08:59:32.910Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:59:32.910Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4616219765354695639"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4616219765354695639"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4616219765354695639"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-10-08"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/Laptops/ASUS-Chromebook-C523NA/\"\u003eASUS Chromebook C523\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"babytiger"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5642103815517355303"},"published":{"$t":"2019-05-17T08:57:52.440Z"},"updated":{"$t":"2019-05-17T08:57:52.440Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:57:52.440Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5642103815517355303"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5642103815517355303"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5642103815517355303"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-09-14"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/Laptops/ASUS-Chromebook-C423NA/\"\u003eASUS Chromebook C423\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"rabbid"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R68"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2094526626321555542"},"published":{"$t":"2019-05-17T08:52:15.598Z"},"updated":{"$t":"2019-05-17T08:55:26.287Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:55:26.287Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2094526626321555542"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2094526626321555542"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2094526626321555542"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-08-08"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/Laptops/ASUS-Chromebook-C223NA/\"\u003eASUS Chromebook C223\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"babymega"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4371707779101689228"},"published":{"$t":"2019-05-17T08:36:01.356Z"},"updated":{"$t":"2019-05-17T08:53:14.551Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:53:14.551Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4371707779101689228"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4371707779101689228"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4371707779101689228"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Release","$t":"2019-04-05"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/Laptops/ASUS-Chromebook-C204MA/\"\u003eASUS Chromebook Flip C204\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Apel"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R73"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3600518828182365263"},"published":{"$t":"2019-05-17T08:46:46.098Z"},"updated":{"$t":"2019-05-17T08:49:56.521Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:49:56.521Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3600518828182365263"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3600518828182365263"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3600518828182365263"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2019-03-15"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/Commercial-Laptops/ASUS-Chromebook-Flip-C434TA/\"\u003eASUS Chromebook Flip C434\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Shyvana"},{"index":"E","name":"Board name(s)","$t":"rammus"},{"index":"F","name":"Base board","$t":"rammus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Amberlake-Y"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5717904112802615927"},"published":{"$t":"2019-05-17T08:41:25.639Z"},"updated":{"$t":"2019-05-17T08:47:51.324Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-17T08:47:51.323Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5717904112802615927"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5717904112802615927"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5717904112802615927"}],"author":[{"name":{"$t":"Agnes Cheng"},"email":{"$t":"agnescheng@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-04-05"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.asus.com/us/2-in-1-PCs/ASUS-Chromebook-Flip-C214MA/\"\u003eASUS-Chromebook-Flip-C214\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Ampton"},{"index":"E","name":"Board name(s)","$t":"octopus"},{"index":"F","name":"Base board","$t":"octopus"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.14"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Gemini Lake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R73"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5958699634040253303"},"published":{"$t":"2019-05-09T15:14:29.678Z"},"updated":{"$t":"2019-05-16T22:07:04.019Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-16T22:07:04.019Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5958699634040253303"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5958699634040253303"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5958699634040253303"}],"author":[{"name":{"$t":"Nigel Sale"},"email":{"$t":"nsale@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-04-01"},{"index":"B","name":"OEM","$t":"CTL"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://ctl.net/collections/tablets/products/ctl-chrome-tablet-tx1\"\u003eCTL Chromebook Tab Tx1\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Druwl"},{"index":"E","name":"Board name(s)","$t":"scarlet"},{"index":"F","name":"Base board","$t":"scarlet"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"RK3399"},{"index":"K","name":"Form Factor","$t":"Chromeblet"},{"index":"L","name":"First Release","$t":"R72"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5182514605328277163"},"published":{"$t":"2019-05-13T21:27:57.164Z"},"updated":{"$t":"2019-05-14T17:48:03.137Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-14T17:48:01.979Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Microarchitectural Data Sampling"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003e\u003cspan style\u003d\"font-size:26pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling\u003c/span\u003e\u003c/p\u003e\u003cspan\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-CVE-2018-12126-CVE-2018-12127-CVE-2018-12130-and-CVE-2019-11091-\" /\u003e(CVE-2018-12126, CVE-2018-12127, CVE-2018-12130, and CVE-2019-11091)\u003c/h1\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Summary\" /\u003e\u003cfont size\u003d\"5\" style\u003d\"font-weight:normal\"\u003eSummary\u003c/font\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling (MDS) refers to a set of speculative execution side-channel vulnerabilities which potentially allow results from previous execution on a core to be observed across security boundaries via microarchitectural state, on certain Intel CPUs. They are described in \u003c/span\u003e\u003ca href\u003d\"https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00233.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eIntel's announcement\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e, and referred to as MSBDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12126\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12126\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMLPDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12127\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12127\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMFBDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12130\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12130\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e, and \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMDSUM/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2019-11091\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2019-11091\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eAn attacker successfully exploiting these vulnerabilities could read sensitive data from other processes running on the system, breaking the isolation between processes provided by modern operating systems. If Chrome processes are attacked, these sensitive data could include website contents as well as passwords, credit card numbers, or cookies. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome, like all programs, relies on the operating system to provide isolation between processes. Operating system vendors may release updates to improve isolation, so users should ensure they install any updates and follow any additional guidance from their operating system vendor in relation to MDS mitigation.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eSome operating system mitigations will also require changes in Chrome which we shall include in subsequent Chrome releases. Users should ensure their version of Chrome is \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/chrome/answer/95414?co\u003dGENIE.Platform%3DDesktop\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ealways up to date\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Response\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Roboto,sans-serif;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eResponse\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Chrome team investigated various mitigation options Chrome could take independently of the OS, but none were sufficiently complete or performant. Users should rely on operating system level mitigations.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Android\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAndroid\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eOn the Android platform, the vast majority of devices are not affected, as these issues only apply to some Intel-based systems.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eAs always, Android users should apply updates for their devices as soon as they are available from their OEM.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-OS\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS has disabled Hyper-Threading on Chrome OS 74 and subsequent versions. This provides protection against attacks using MDS. \u003c/span\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/mds-on-chromeos\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eMore details on Chrome OS's response\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-macOS\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003emacOS\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003emacOS Mojave 10.14.5 \u003ca href\u003d\"https://support.apple.com/en-us/HT210107\" rel\u003d\"nofollow\"\u003eincludes MDS mitigations\u003c/a\u003e. These have been adopted by Chrome and will be included in Chrome 75 which will be released to the Stable channel on or around the 4th of June.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Windows\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eWindows\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eWindows users should apply updates with MDS mitigations as soon as they are available, and \u003ca href\u003d\"https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV190013\" rel\u003d\"nofollow\"\u003efollow any guidance to adjust system settings if appropriate\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-iOS\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eiOS\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eApple iOS devices use CPUs not known to be vulnerable to MDS.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Linux\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Roboto,sans-serif;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eLinux\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eLinux users should apply kernel and CPU microcode updates as soon as they are available from their distribution vendor, and follow any guidance to adjust system settings.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/mds"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5182514605328277163"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5182514605328277163"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5182514605328277163"}],"author":[{"name":{"$t":"Andrew Whalley"},"email":{"$t":"awhalley@chromium.org"}}],"sites$pageName":{"$t":"mds"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8522932979489712693"},"published":{"$t":"2019-05-14T15:48:34.748Z"},"updated":{"$t":"2019-05-14T17:03:26.595Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-14T17:00:38.380Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Microarchitectural Data Sampling on Chrome OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003e\u003cspan style\u003d\"font-size:26pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling on Chrome OS \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:16pt\"\u003e\u003cspan style\u003d\"font-size:15pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(CVE-2018-12126, CVE-2018-12127, CVE-2018-12130, and CVE-2019-11091)\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Vulnerability-Impact\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eVulnerability Impact\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling (MDS) is a group of vulnerabilities that allow an attacker to potentially read sensitive data.  If Chrome processes are attacked, these sensitive data could include website contents as well as passwords, credit card numbers, or cookies. The vulnerabilities can also be exploited to read host memory from inside a virtual machine, or for an Android App to read privileged process memory (e.g. keymaster). See below for affected devices.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Chrome-OS-Response\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS Response\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo protect users, Chrome OS 74 disables Hyper-Threading by default. For the majority of our users, whose workflows are primarily interactive, this mitigates the security risk of MDS without a noticeable loss of responsiveness. Chrome OS 75 will contain additional mitigations.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUsers concerned about the performance loss, such as those running CPU intensive workloads, may enable Hyper-Threading on a per machine basis. The setting is located at chrome://flags#scheduler-configuration. The \"performance\" setting chooses the configuration that enables Hyper-Threading. The \"conservative\" setting chooses the configuration that disables Hyper-Threading.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEnterprises who wish to set Hyper-Threading policy organizationally may use the enterprise policy named “SchedulerConfiguration.”\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Hyper-Threading-Policy-Guidance\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eHyper-Threading Policy Guidance\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe decision to disable or enable Hyper-Threading is a security versus performance tradeoff. With Hyper-Threading disabled, Intel CPUs may experience reduced performance, which varies depending on the workload. But, with Hyper-Threading enabled, users could execute code, such as by visiting a website or running an Android app, that exploits MDS to read sensitive memory contents. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAs of May 14th, 2019, Google is not aware of any active exploitation of the MDS vulnerabilities. Users and customers who process particularly sensitive data on their Chrome OS devices are nonetheless advised to disable Hyper-Threading as a measure of caution.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Vulnerability-Description\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eVulnerability Description\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling (MDS) refers to a set of speculative execution side-channel vulnerabilities which potentially allow results from previous execution on a core to be observed across security boundaries via microarchitectural state, on certain Intel CPUs. They are described in \u003c/span\u003e\u003ca href\u003d\"https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00233.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIntel's announcement\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and referred to as MSBDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12126\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12126\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, MLPDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12127\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12127\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, MFBDS/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2018-12130\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-12130\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and MDSUM/\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003d2019-11091\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2019-11091\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. See below for more details.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Microarchitectural-Store-Buffer-Data-Sampling-MSBDS-and-Microarchitectural-Fill-Buffer-Data-Sampling-MFBDS-\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Store Buffer Data Sampling (MSBDS) and Microarchitectural Fill Buffer Data Sampling (MFBDS)\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:16pt\"\u003e\u003cspan style\u003d\"font-size:15pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(CVE-2018-1212 and CVE-2018-12130 respectively)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIntel CPUs use microarchitectural data structures known as the fill buffer and store buffer. The fill buffer contains loaded data pending insertion into the L1 cache. The store buffer contains stored data pending write to the memory subsystem. Concurrently executing threads, on the same physical CPU core, may potentially read the contents of prior entries for these buffers by observing timing side channels when speculatively executed.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Microarchitectural-Load-Port-Data-Sampling-MLPDS-\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Load Port Data Sampling (MLPDS) \u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:16pt\"\u003e\u003cspan style\u003d\"font-size:15pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(CVE-2018-12127)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLoad ports are used by the CPUs to perform load operations from memory or I/O. The bus in the load ports may retain data from old operations, allowing one process to leak data from another process through speculative execution side channels.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Microarchitectural-Data-Sampling-Uncacheable-Memory-MDSUM-\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eMicroarchitectural Data Sampling Uncacheable Memory (MDSUM)\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:16pt\"\u003e\u003cspan style\u003d\"font-size:15pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(CVE-2019-11091)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUncacheable memory (UC) is read from RAM without filling the CPU’s cache with a new line. However, uncacheable memory does still move through the store buffers, fill buffers, and load ports;allowing data stored in UC regions to still be leaked via the mechanisms described above.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Affected-Devices\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected Devices\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS devices with affected Intel CPUs, supported as of May 14th, 2019, are as follows:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAOpen Chromebase Commercial\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAOpen Chromebox Commercial\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASI Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebook C200MA\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebook C300MA\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebook Flip C302\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebox 3\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebox CN60\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eASUS Chromebox CN62\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer C720 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebase 24\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook 11 (C740)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook 11 (C771 / C771T)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook 13  (CB713-1W )\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook 15 (C910 / CB5-571)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook 15 (CB3-531)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebook Spin 13 (CP713-1WN)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebox CXI2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eAcer Chromebox CXI3\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eBobicus Chromebook 11\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eCTL Chromebox CBx1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eCTL N6 Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eChromebook 11 (C730 / CB3-111)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eChromebook 11 (C735)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eChromebook 14 for work (CP5-471)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eChromebox Reference\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eConsumer Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eCrambo Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Chromebook 11\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Chromebook 11 (3120)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Chromebook 13 3380\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Chromebook 13 7310\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eDell Inspiron Chromebook 14 2-in-1 7486\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eEducation Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eeduGear Chromebook R\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eEdxis Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eEdxis Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Chromebook Pixel (2015)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eGoogle Pixelbook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHEXA Chromebook Pi\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook 11 2100-2199 / HP Chromebook 11 G3\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook 11 2200-2299 / HP Chromebook 11 G4/G4 EE\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook 13 G1\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook 14\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook 14 ak000-099 / HP Chromebook 14 G4\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook x2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebook x360 14\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebox CB1-(000-099) / HP Chromebox G1/ HP Chromebox for Meetings\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHP Chromebox G2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eHaier Chromebook 11 G2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eJP Sa Couto Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLG Chromebase 22CB25S\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLG Chromebase 22CV241\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo 100S Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo N20 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo N21 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo ThinkCentre Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo ThinkPad 11e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eLenovo Thinkpad X131e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eM\u0026amp;A Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003ePixel Slate\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eRGS Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eSamsung Chromebook 2 11 - XE500C12\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eSamsung Chromebook Plus (LTE)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eSamsung Chromebook Plus (V2)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eSamsung Chromebook Pro\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eSenkatel C1101 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eThinkpad 13 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eToshiba Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eToshiba Chromebook 2\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eToshiba Chromebook 2 (2015 Edition)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eTrue IDC Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eVideonet Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eViewSonic NMP660 Chromebox\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003eYoga C630 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/mds-on-chromeos"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8522932979489712693"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8522932979489712693"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8522932979489712693"}],"author":[{"name":{"$t":"Greg Kerr"},"email":{"$t":"kerrnel@chromium.org"}}],"sites$pageName":{"$t":"mds-on-chromeos"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8863748368741374308"},"published":{"$t":"2018-08-13T21:33:46.833Z"},"updated":{"$t":"2019-05-14T15:47:13.385Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-01T18:33:30.375Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"L1TF on Chrome OS (a.k.a. Foreshadow \u0026 CVE-2018-3646)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Vulnerability-Description\" /\u003eVulnerability Description\u003c/h1\u003e\r\n\u003cp\u003eSoftware running in a virtualized operating system may exploit a bug in the Extended Page Tables implementation to read arbitrary physical memory. This allows guest operating systems to access memory contents belonging to the host OS that are meant to be protected from access. This may allow malicious guests to steal sensitive data from other applications running on the machine.\u003c/p\u003e\r\n\u003ch1\u003e\u003ca name\u003d\"TOC-Chrome-OS-response\" /\u003eChrome OS response\u003c/h1\u003e\r\n\u003cp\u003eThe vast majority of Chrome OS users are unaffected given that Chrome OS currently only uses virtualization for running Linux App Containers (aka Termina), which is under development and only available in Beta, Dev, and Canary update channels of Chrome OS. Users who don't use the Linux App Containers feature don't need to take action at this point.\u003c/p\u003e\r\n\u003cp\u003eChrome OS will not release the Linux apps for Chrome OS feature to the stable channel before September, at which point users will have received the necessary mitigations in Chrome OS 69 via auto-updates. No further action by stable channel users are expected to be necessary. Beta, Dev, and Canary channel users will receive fixes as soon as possible now that public patches are available. Beta, Dev, and Canary users concerned about the attack in the meantime may temporarily stop using Linux App Containers.\u003c/p\u003e\r\n\u003ch1\u003e\u003ca name\u003d\"TOC-Affected-devices-and-Patch-Status\" /\u003eAffected devices and Patch Status\u003c/h1\u003e\r\n\u003cp\u003eChrome OS devices with Core Intel CPUs running virtual machines are affected. All listed devices have fixes in Dev, Canary, Beta and Stable builds.\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\r\nGoogle Pixelbook\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nHP Chromebox G2\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nSamsung Chromebook Plus (V2)\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nAcer Chromebox CXI3\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nHP Chromebook x2\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nASUS Chromebox 3\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nViewSonic NMP660 Chromebox\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nCTL Chromebox CBx1\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nToshiba Chromebook 2 (2015 Edition)\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nAcer Chromebook 11 (C740)\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nAcer Chromebox CXI2\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nAcer Chromebook 15 (C910 / CB5-571)\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nAcer Chromebox CXI3\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\nDell Chromebook 11\r\n\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eFor code names, see our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices\"\u003emain device page\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/containers-update"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8863748368741374308"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8863748368741374308"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8863748368741374308"}],"author":[{"name":{"$t":"Greg Kerr"},"email":{"$t":"kerrnel@chromium.org"}}],"sites$pageName":{"$t":"containers-update"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1056520410069787924"},"published":{"$t":"2019-05-09T15:20:28.323Z"},"updated":{"$t":"2019-05-09T15:20:28.323Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-09T15:20:28.323Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1056520410069787924"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1056520410069787924"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1056520410069787924"}],"author":[{"name":{"$t":"Nigel Sale"},"email":{"$t":"nsale@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-01"},{"index":"B","name":"OEM","$t":"CTL"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://ctl.net/collections/chromebox-1/products/ctl-chromebox\"\u003eCTL Chromebox CBx1\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Wukong"},{"index":"E","name":"Board name(s)","$t":"fizz"},{"index":"F","name":"Base board","$t":"fizz"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8515600505144917166"},"published":{"$t":"2019-05-09T15:17:05.086Z"},"updated":{"$t":"2019-05-09T15:17:05.086Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-09T15:17:05.086Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8515600505144917166"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8515600505144917166"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8515600505144917166"}],"author":[{"name":{"$t":"Nigel Sale"},"email":{"$t":"nsale@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-15"},{"index":"B","name":"OEM","$t":"CTL"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://ctl.net/products/ctl-chromebook-j41\"\u003eCTL Chromebook J41\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Whitetip"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5621545940111103592"},"published":{"$t":"2019-05-09T15:09:16.655Z"},"updated":{"$t":"2019-05-09T15:09:16.655Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-09T15:09:16.655Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5621545940111103592"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5621545940111103592"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5621545940111103592"}],"author":[{"name":{"$t":"Nigel Sale"},"email":{"$t":"nsale@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-30"},{"index":"B","name":"OEM","$t":"CTL"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://ctl.net/products/ctl-nl7t-chromebook-for-education-1\"\u003eCTL Chromebook NL7T-360\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Blacktip360"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1949663134512369070"},"published":{"$t":"2019-05-09T14:59:59.722Z"},"updated":{"$t":"2019-05-09T15:07:32.830Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-05-09T15:07:32.830Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1949663134512369070"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1949663134512369070"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1949663134512369070"}],"author":[{"name":{"$t":"Nigel Sale"},"email":{"$t":"nsale@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-30"},{"index":"B","name":"OEM","$t":"CTL"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://ctl.net/products/ctl-chromebook-nl7-for-education\"\u003eCTL Chromebook NL7\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Blacktip"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/707137575722850640"},"published":{"$t":"2019-04-30T02:57:27.283Z"},"updated":{"$t":"2019-04-30T02:57:27.311Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-30T02:57:27.283Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chameleon_B1_R1.2- Gerber file.zip"},"summary":{},"content":{"type":"application/zip","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/707137575722850640"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3237111171154818375"},{"rel":"alternate","type":"application/zip","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/chamelium/Chameleon_B1_R1.2-%20Gerber%20file.zip"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/707137575722850640"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/707137575722850640"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/707137575722850640"},{"rel":"edit-media","type":"application/zip","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/707137575722850640"}],"author":[{"name":{"$t":"Tony Lin"},"email":{"$t":"tonycwlin@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2328695914738661309"},"published":{"$t":"2017-12-11T18:42:40.563Z"},"updated":{"$t":"2019-04-26T18:24:38.772Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-26T18:24:37.113Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Axe-Core Testing"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"5\"\u003eTL;DR\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003e\u003cbr /\u003e\u003c/font\u003e\r\n\u003cdiv\u003eWriting an accessibility (a11y) test with axe-core will create 1 test for each rule and test created. This will prevent timeouts.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eA11y tests DO NOT run in DEBUG builds\u003c/font\u003e\u003c/b\u003e (also to prevent timeouts), this shouldn't be an issue since we're only testing web UI with axe-core.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003eSimple Test\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:#afafaf\"\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e// Copyright 2019 The Chromium Authors. All rights reserved.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e// Use of this source code is governed by a BSD-style license that can be\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e// found in the LICENSE file.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e// Polymer BrowserTest fixture and aXe-core accessibility audit.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eGEN_INCLUDE([\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  '//chrome/test/data/webui/a11y/accessibility_test.js'\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  '//chrome/test/data/webui/polymer_browser_test_base.js'\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e]);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003eTestFixture \u003d \u003c/span\u003e\u003cfont color\u003d\"#7f6000\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003eclass\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e extends PolymerTest \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e{\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  \u003cfont color\u003d\"#ffffff\"\u003e/** @override */\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  get browsePreload() \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    return \u003cfont color\u003d\"#38761d\"\u003e'chrome://settings/'\u003c/font\u003e;  \u003cfont color\u003d\"#ffffff\"\u003e// URL of page to test.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#ffffff\"\u003e  \u003c/font\u003e\u003cfont color\u003d\"#0000ff\"\u003e}\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#0000ff\" face\u003d\"courier new, monospace\" style\u003d\"font-size:10pt\"\u003e}\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:13.3333px\"\u003e;\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eAccessibilityTest.define(\u003cfont color\u003d\"#38761d\"\u003e'TestFixture'\u003c/font\u003e, \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e  \u003c/font\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(255,255,255);font-family:courier new,monospace;font-size:10pt\"\u003e// Must be unique within the test fixture and cannot have spaces.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  name: \u003cfont color\u003d\"#38761d\"\u003e'TestSuiteName'\u003c/font\u003e,\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  \u003cfont color\u003d\"#ffffff\"\u003e// Optional. Configuration for axe-core. Can be used to disable a test.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  axeOptions: \u003cfont color\u003d\"#0000ff\"\u003e{}\u003c/font\u003e,\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  \u003cfont color\u003d\"#ffffff\"\u003e// Optional. Filter on failures. Use this for individual false positives.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  violationFilter: \u003cfont color\u003d\"#0000ff\"\u003e{}\u003c/font\u003e,\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  \u003cfont color\u003d\"#ffffff\"\u003e// Optional. Any setup required for all tests. This will run before each one.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  setup: function() \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e  }\u003c/font\u003e,\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  tests: \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    \u003cfont color\u003d\"#38761d\"\u003e'Test case description'\u003c/font\u003e: function() \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e      \u003cfont color\u003d\"#ffffff\"\u003e// Set up an individual test case. You can open up a dialog or click\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e      // buttons to get the test to the state that should be tested for a11y.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e      // This will run once per axe-core a11y rule.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#ffffff\" face\u003d\"courier new, monospace\"\u003e      // Can return a promise for async setup.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    \u003cfont color\u003d\"#0000ff\"\u003e}\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e  }\u003c/font\u003e,\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e}\u003c/font\u003e);\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003eExamples\u003c/font\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/chrome/test/data/webui/settings/a11y/\" target\u003d\"_blank\"\u003eMD Settings\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/chrome/test/data/webui/extensions/a11y/\" target\u003d\"_blank\"\u003eMD Extension\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003es\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003eHow it Works\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAccessibility audits can take a while to run, so we broke each audit out into its own test. This would be tedious to do by hand so the \u003cfont face\u003d\"courier new, monospace\"\u003eAccessibilityTest.define\u003c/font\u003e function will create them based on some params. This calls TEST_F for each test that's being created and uses a test fixture like all web UI tests. In the past, a11y audit was tacked onto the end of all web UI tests but we want to avoid timeouts since the number of tests in axe-core is much larger than ADT, so a11y tests now have to be \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ecreated\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e manually-ish.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eEach test inside the \u003cfont face\u003d\"courier new, monospace\"\u003etests\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e data member will be run as its own Mocha test.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eExample:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"background-color:rgb(175,175,175)\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003eAccessibilityTest.define(\u003c/span\u003e\u003cfont color\u003d\"#38761d\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e'TestFixture'\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e{\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e  name:\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont color\u003d\"#38761d\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e'TestSuiteName'\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e,\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e  tests:\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e{\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    \u003cfont color\u003d\"#38761d\"\u003e'Test1'\u003c/font\u003e: function() \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e      \u003c/font\u003e\u003cfont color\u003d\"#ffffff\"\u003e// No special setup\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e},\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    \u003cfont color\u003d\"#38761d\"\u003e'Test2'\u003c/font\u003e: function() \u003cfont color\u003d\"#0000ff\"\u003e{\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,255,255);font-family:courier new,monospace\"\u003e      // Show the dialog before testing for a11y.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,255,255);font-family:courier new,monospace\"\u003e      \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003elet\u003c/font\u003e dialog \u003d \u003cfont color\u003d\"#7f6000\"\u003edocument\u003c/font\u003e.querySelector(\u003cfont color\u003d\"#38761d\"\u003e'#dialog'\u003c/font\u003e);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e      dialog.showModal();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e},\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#0000ff\" style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e  }\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt\"\u003e,\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e}\u003c/font\u003e);\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThat code snippet will create the following tests:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_accesskeys\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_area_alt\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_allowed_attr\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_hidden_body\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_required_attr\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_required_children\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_required_parent\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_roles\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_valid_attr\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_aria_valid_attr_value\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_audio_caption\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_blink\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_button_name\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_bypass\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_checkboxgroup\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_definition_list\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_dlitem\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_document_title\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_duplicate_id\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_empty_heading\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_frame_title\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_frame_title_unique\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_heading_order\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_hidden_content\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_href_no_hash\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_html_has_lang\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_html_lang_valid\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_image_alt\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_image_redundant_alt\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_input_image_alt\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_label\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_label_title_only\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_layout_table\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_link_in_text_block\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_link_name\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_list\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_listitem\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_marquee\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_meta_refresh\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_meta_viewport\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_meta_viewport_large\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_object_alt\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_p_as_heading\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_radiogroup\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_region\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_scope_attr_valid\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_server_side_image_map\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_tabindex\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_table_duplicate_name\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_table_fake_caption\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_td_has_header\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_td_headers_attr\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_th_has_data_cells\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_valid_lang\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_video_caption\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eTestFixture.TestSuiteName_video_description\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003eEach of these tests will have a mocha body that will run both \u003cfont face\u003d\"courier new, monospace\"\u003eTest1\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003eTest2\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, then run the a11y audit on the state of the page after each test setup.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://go/a11y-chrome-settings-design\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eGoogler only link to design doc\u003c/a\u003e. (Doc has a lot of overlap with this page, but goes more into design considerations)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003eDebugging\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eAxe-Core has an extension that can be used to debug by running the same library that we run the tests with.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://chrome.google.com/webstore/detail/axe/lhdoppojpmngadmnindnejefpokejbdd\" target\u003d\"_blank\"\u003eOfficial Extension\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"http://go/axe-core-chrome-extension\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eGoogler Extension\u003c/a\u003e (\u003ca href\u003d\"http://go/axe-core-chrome-extension-source\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003esource\u003c/a\u003e)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou must pass in the \u003cfont face\u003d\"courier new, monospace\"\u003e--extensions-on-chrome-urls\u003c/font\u003e flag in order to run these extensions on \u003cfont face\u003d\"courier new, monospace\"\u003echrome://\u003c/font\u003e urls. This is a security risk, so only run extensions you trust when doing this.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003eRunning Locally\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eThe axe-core a11y audit is part of \u003cfont face\u003d\"courier new, monospace\"\u003ebrowser_tests\u003c/font\u003e. Instructions for building are the same as that target.\u003c/div\u003e\u003cdiv\u003eNote: axe-core tests are NOT part of DEBUG builds to prevent timeouts on test bots.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1124660369381645513"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/accessibility/testing/axe-core"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2328695914738661309"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2328695914738661309"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2328695914738661309"}],"author":[{"name":{"$t":"Hector Carmona"},"email":{"$t":"hcarmona@chromium.org"}}],"sites$pageName":{"$t":"axe-core"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5310666519449002717"},"published":{"$t":"2012-12-11T21:53:30.891Z"},"updated":{"$t":"2019-04-24T23:18:53.263Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-24T23:18:50.837Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Embedded Search API"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb style\u003d\"font-family:Times;font-weight:normal\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document describes a replacement for the \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/searchbox\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eSearchBox API\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e designed for search providers included with Chromium to allow them to integrate more tightly with Chrome’s Omnibox and New Tab Page. This document will be kept up to date with the changes in trunk Chromium and is to be considered the authoritative reference on this new API.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times;font-weight:normal\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"5\"\u003eOverview\u003c/font\u003e\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:medium;font-weight:normal;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Embedded Search API provides a point of integration for a default search provider: \u003c/span\u003e\u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003eThe provider is responsible for rendering the New Tab Page (NTP).\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:10pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;font-weight:normal;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSearch providers who wish to try EmbeddedSearch NewTabPage API can do so by modifying the TemplateURL data for their provider (in \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/components/search_engines/prepopulated_engines.json\"\u003esrc/components/search_engines/prepopulated_engines.json\u003c/a\u003e) to add a \"\u003c/span\u003e\u003c/b\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:medium;font-weight:normal;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003enew_tab_url\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;font-weight:normal;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\" field pointing to an URL that will render the NTP. Implementers can find an example in the chromium sources at \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/resources/local_ntp/local_ntp.js\" target\u003d\"_blank\"\u003esrc/chrome/browser/resources/local_ntp/local_ntp.js\u003c/a\u003e.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"5\"\u003eReference\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e// This interface is exposed as window.chrome.embeddedSearch to the embedded search page.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003einterface EmbeddedSearch {\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // Interface to allow the embedded search page to interact with and control the \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // navigator searchbox. Exposed as window.chrome.embeddedSearch.searchBox.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e interface SearchBox {\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e // Indicates whether the browser is rendering its UI in rigth-to-left mode.\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\" style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e    readonly attribute unsigned boolean \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ertl\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e    // Requests the searchbox to enter (or exit) a mode where it is not visibly focused\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e    // but if the user presses a key will capture it and focus itself. Conceptually \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e    // similar to an invisible focus() call.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e   void \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003estartCapturingKeyStrokes\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e   void \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003estopCapturingKeyStrokes\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e   // Attribute and listener to detect if the searchbox is currently capturing user key\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e   // strokes.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e   readonly attribute boolean \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eisFocused\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e   readonly attribute boolean \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eisKeyCaptureEnabled\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e attribute Function \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eonfocuschange\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e attribute Function \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eonkeycapturechange\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e };  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(153,153,153);vertical-align:baseline;white-space:pre-wrap\"\u003e// interface Searchbox\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // Interface to allow the embedded search page to interact with and control the\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // New Tab\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003ePage. Exposed as window.chrome.embeddedSearch.newTabPage.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e interface NewTabPage {\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium\"\u003e   // Attribute and listeners that indicate to the new tab page whether user input\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium\"\u003e // is in progress in the omnibox.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e readonly attribute boolean \u003c/span\u003e\u003cb\u003eisInputInProgress\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e attribute Function \u003cb\u003eoninputstart\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e attribute Function \u003cb\u003eoninputcancel\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e   // List of user's most visited items.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute Array\u0026lt;MostVisitedItem\u0026gt; \u003cb\u003emostVisited\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e    attribute Function \u003cb\u003eonmostvisitedchange\u003c/b\u003e;\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e   // Deletes the most visited item corresponding to |restrictedID|.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e    function \u003cb\u003edeleteMostVisitedItem(\u003c/b\u003erestrictedID\u003cb\u003e)\u003c/b\u003e;\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e   // Undoes the deletion of the item for |restrictedID|.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e    function \u003cb\u003eundoMostVisitedDeletion(\u003c/b\u003erestrictedID\u003cb\u003e)\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e   // Undoes the deletion of all most visited items.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e    function \u003cb\u003eundoAllMostVisitedDeletions()\u003c/b\u003e;\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e   // Information necessary to render the user's theme background \u003c/span\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003eon the NTP.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e    readonly attribute ThemeBackgroundInfo \u003c/span\u003ethemeBackgroundInfo\u003cspan style\u003d\"font-weight:normal\"\u003e;\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e attribute Function \u003c/span\u003e\u003cb\u003eonthemechange\u003c/b\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e }; \u003c/span\u003e\u003cspan style\u003d\"color:rgb(153,153,153);vertical-align:baseline;white-space:pre-wrap\"\u003e// interface NewTabPage\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e};\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e// Format for a most visited object supplied by the browser.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// Most visited items are represented by an opaque identifier, the \"rid\". After M72, Chrome\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// provides one special URL that the page can render as \u0026lt;iframe\u0026gt;s to display\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// most visited data:\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// chrome-search://most-visited/title.html?rid\u003d\u0026lt;RID\u0026gt;\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// \u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e// Prior to M72, Chrome also provided a second URL which has now been deprecated:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e// \u003cspan\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e// [deprecated] chrome-search://most-visited/thumbnail.html?rid\u003d\u0026lt;RID\u0026gt;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// The URL also accepts the following query parameters to modify the style of the\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// content inside the iframe:\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// 'c' : Color of the text in the iframe.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// 'f' : Font family for the text in the iframe.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre-wrap;color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e// 'fs' : Font size for the text in the iframe.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// 'pos' : The position of the iframe in the UI.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// For example, the page could create the following iframe \u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e//\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e// \u0026lt;iframe src\u003d\"chrome-search://most-visited/title.html?rid\u003d5\u0026amp;c\u003d\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e777777\u0026amp;f\u003d\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003earial%2C%20sans-serif\u0026amp;fs\u003d11\u0026amp;pos\u003d0\"\u0026gt;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e//\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#cc0000\" face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e// to render the title for the first most visited item.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003eMostVisitedItem {\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // The restricted ID (an opaque identifier) to refer to this item.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute unsigned long \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003erid\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // URL to load the favicon for the most visited item as an image.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e //\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // NOTE: the URL is \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003eparticular to the current instance of the New Tab page and\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e // cannot be\u003c/span\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e reused. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute string \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003efaviconUrl\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e}\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e// Format of the ThemeBackgroundInfo object which indicates information about the user's\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e// chosen custom UI theme necessary for correct rendering of the new tab page.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eThemeBackgroundInfo {\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // NOTE: The following fields are always present.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0)\"\u003e\u003cbr /\u003e // True if the default theme is selected.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e  readonly attribute boolean \u003cb\u003eusingDefaultTheme\u003c/b\u003e;\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(204,0,0);white-space:pre-wrap;font-family:courier new,monospace;font-size:medium;background-color:transparent\"\u003e // Theme background color in RGBA format.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute Array \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ebackgroundColorRgba\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e\u003cbr /\u003e // Theme text color in RGBA format.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute Array \u003cb\u003etextColor\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003eRgba\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);font-family:courier new,monospace;font-size:medium;white-space:pre-wrap\"\u003e\u003cbr /\u003e // Theme text color light in RGBA format.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute Array \u003cb\u003etextColorLight\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003eRgba\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0)\"\u003e // True if the theme has an alternate logo.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e  readonly attribute boolean \u003cb\u003elogoAlternate\u003c/b\u003e;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // NOTE: The following fields are all optional.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // Theme background-position x component.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute String \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eimageHorizontalAlignment\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // Theme background-position y component.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute String \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eimageVerticalAlignment\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003e // Theme background-repeat.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e readonly attribute String \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eimageTiling\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e;\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0)\"\u003e // True if the theme has an \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13.3333px;white-space:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"color:rgb(204,0,0);vertical-align:baseline;white-space:pre-wrap\"\u003eattribution\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(204,0,0)\"\u003e logo.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e  readonly attribute boolean \u003cb\u003ehasAttribution\u003c/b\u003e;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e};\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cpre style\u003d\"margin-top:0px;margin-bottom:0px;padding-top:0.5em;outline:none;font-size:medium;line-height:16.25px\"\u003e\u003cbr /\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;font-style:italic;white-space:pre-wrap\"\u003eLast edited: Wednesday, November 12, 2018, 10:45 PM PST\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/embeddedsearch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5310666519449002717"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5310666519449002717"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5310666519449002717"}],"author":[{}],"sites$pageName":{"$t":"embeddedsearch"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2187609824886192973"},"published":{"$t":"2010-11-28T07:41:10.032Z"},"updated":{"$t":"2019-04-17T19:37:24.423Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-17T19:37:22.591Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Network Stack"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eWarning\u003c/font\u003e:\u003c/b\u003e This document is somewhat outdated. See \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/net/docs/life-of-a-url-request.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/net/docs/life-of-a-url-request.md\u003c/a\u003e for more modern information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Code-Layout\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eCode Layout\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Anatomy-of-a-Network-Request-focused-on-HTTP-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eAnatomy of a Network Request (focused on HTTP)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-URLRequest\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eURLRequest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-URLRequestHttpJob\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eURLRequestHttpJob\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-HttpNetworkTransaction\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eHttpNetworkTransaction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-HttpStreamFactory\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003eHttpStreamFactory\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Proxy-Resolution\"\u003e\u003cstrong\u003e3.4.1 \u003c/strong\u003eProxy Resolution\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Connection-Management\"\u003e\u003cstrong\u003e3.4.2 \u003c/strong\u003eConnection Management\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Host-Resolution\"\u003e\u003cstrong\u003e3.4.3 \u003c/strong\u003eHost Resolution\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-SSL-TLS\"\u003e\u003cstrong\u003e3.4.4 \u003c/strong\u003eSSL/TLS\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003cdiv\u003eThe network stack is a mostly single-threaded cross-platform library primarily for resource fetching.  Its main interfaces are \u003ccode\u003eURLRequest\u003c/code\u003e and \u003ccode\u003eURLRequestContext\u003c/code\u003e.  \u003ccode\u003eURLRequest\u003c/code\u003e, as indicated by its name, represents the request for a \u003ca href\u003d\"http://en.wikipedia.org/wiki/URL\" rel\u003d\"nofollow\"\u003eURL\u003c/a\u003e.  \u003ccode\u003eURLRequestContext\u003c/code\u003e contains all the associated context necessary to fulfill the URL request, such as \u003ca href\u003d\"http://en.wikipedia.org/wiki/HTTP_cookie\" rel\u003d\"nofollow\"\u003ecookies\u003c/a\u003e, host resolver, proxy resolver, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/http-cache\"\u003ecache\u003c/a\u003e, etc. Many \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eURLRequest\u003c/span\u003e objects may share the same \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eURLRequestContext\u003c/span\u003e.  Most \u003ccode\u003enet\u003c/code\u003e objects are not threadsafe, although the disk cache can use a dedicated thread, and several components (host resolution, certificate verification, etc.) may use unjoined worker threads.  Since it primarily runs on a single network thread, no operation on the network thread is allowed to block.  Therefore we use non-blocking operations with asynchronous callbacks (typically \u003ccode\u003eCompletionCallback\u003c/code\u003e).  The network stack code also logs most operations to \u003ccode\u003eNetLog\u003c/code\u003e, which allows the consumer to record said operations in memory and render it in a user-friendly format for debugging purposes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChromium developers wrote the network stack in order to:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAllow coding to cross-platform abstractions\u003c/li\u003e\u003cli\u003eProvide greater control than would be available with higher-level system networking libraries (e.g. WinHTTP or WinINET)\u003c/li\u003e\u003cul\u003e\u003cli\u003eAvoid bugs that may exist in system libraries\u003c/li\u003e\u003cli\u003eEnable greater opportunity for performance optimizations\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Code-Layout\" /\u003eCode Layout\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/base\u003c/font\u003e - Grab bag of \u003ccode\u003enet\u003c/code\u003e utilities, such as host resolution, cookies, network change detection, \u003ca href\u003d\"http://en.wikipedia.org/wiki/Transport_Layer_Security\" rel\u003d\"nofollow\"\u003eSSL\u003c/a\u003e.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/disk_cache\u003c/font\u003e - \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache\"\u003eCache for web resources\u003c/a\u003e.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/ftp\u003c/font\u003e - \u003ca href\u003d\"http://en.wikipedia.org/wiki/File_Transfer_Protocol\" rel\u003d\"nofollow\"\u003eFTP\u003c/a\u003e implementation.  Code is primarily based on the old HTTP implementation.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/http\u003c/font\u003e - \u003ca href\u003d\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol\" rel\u003d\"nofollow\"\u003eHTTP\u003c/a\u003e implementation.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/ocsp\u003c/font\u003e - \u003ca href\u003d\"http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol\" rel\u003d\"nofollow\"\u003eOCSP\u003c/a\u003e implementation when not using the system libraries or if the system does not provide an OCSP implementation. Currently only contains an NSS based implementation.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/proxy\u003c/font\u003e - Proxy (\u003ca href\u003d\"http://en.wikipedia.org/wiki/SOCKS\" rel\u003d\"nofollow\"\u003eSOCKS\u003c/a\u003e and HTTP) configuration, resolution, script fetching, etc.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/quic\u003c/font\u003e - \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/quic\"\u003eQUIC\u003c/a\u003e implementation.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/socket\u003c/font\u003e - Cross-platform implementations of \u003ca href\u003d\"http://en.wikipedia.org/wiki/Transmission_Control_Protocol\" rel\u003d\"nofollow\"\u003eTCP\u003c/a\u003e sockets, \"SSL sockets\", and socket pools.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/socket_stream\u003c/font\u003e - socket streams for WebSockets.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/spdy\u003c/font\u003e - HTTP2 (and its predecessor) \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy\"\u003eSPDY\u003c/a\u003e implementation.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/url_request\u003c/font\u003e - \u003ccode\u003eURLRequest\u003c/code\u003e, \u003ccode\u003eURLRequestContext\u003c/code\u003e, and \u003ccode\u003eURLRequestJob\u003c/code\u003e implementations.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enet/websockets\u003c/font\u003e - \u003ca href\u003d\"http://en.wikipedia.org/wiki/WebSockets\" rel\u003d\"nofollow\"\u003eWebSockets\u003c/a\u003e implementation.\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Anatomy-of-a-Network-Request-focused-on-HTTP-\" /\u003eAnatomy of a Network Request (focused on HTTP)\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/Chromium%20HTTP%20Network%20Request%20Diagram.svg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1365539027235/developers/design-documents/network-stack/Chromium%20HTTP%20Network%20Request%20Diagram.svg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-URLRequest\" /\u003eURLRequest\u003c/h3\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eclass URLRequest {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e public:\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Construct a URLRequest for |url|, notifying events to |delegate|.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  URLRequest(const GURL\u0026amp; url, Delegate* delegate);\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  \u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Specify the shared state\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  void set_context(URLRequestContext* context);\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Start the request. Notifications will be sent to |delegate|.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  void Start();\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Read data from the request.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  bool Read(IOBuffer* buf, int max_bytes, int* bytes_read);\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eclass URLRequest::Delegate {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e public:\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Called after the response has started coming in or an error occurred.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  virtual void OnResponseStarted(...) \u003d 0;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Called when Read() calls complete.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  virtual void OnReadCompleted(...) \u003d 0;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eWhen a \u003ccode\u003eURLRequest\u003c/code\u003e is started, the first thing it does is decide what type of \u003ccode\u003eURLRequestJob\u003c/code\u003e to create. The main job type is the \u003ccode\u003eURLRequestHttpJob\u003c/code\u003e which is used to fulfill http:// requests.  There are a variety of other jobs, such as \u003ccode\u003eURLRequestFileJob\u003c/code\u003e (file://), \u003ccode\u003eURLRequestFtpJob\u003c/code\u003e (ftp://), \u003ccode\u003eURLRequestDataJob\u003c/code\u003e (data://), and so on. The network stack will determine the appropriate job to fulfill the request, but it provides two ways for clients to customize the job creation: \u003ccode\u003eURLRequest::Interceptor\u003c/code\u003e and \u003ccode\u003eURLRequest::ProtocolFactory\u003c/code\u003e. These are fairly redundant, except that \u003ccode\u003eURLRequest::Interceptor\u003c/code\u003e's interface is more extensive. As the job progresses, it will notify the \u003ccode\u003eURLRequest\u003c/code\u003e which will notify the \u003ccode\u003eURLRequest::Delegate\u003c/code\u003e as needed.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-URLRequestHttpJob\" /\u003eURLRequestHttpJob\u003c/h3\u003e\u003cdiv\u003eURLRequestHttpJob will first identify the cookies to set for the HTTP request, which requires querying the \u003ccode\u003eCookieMonster\u003c/code\u003e in the request context. This can be asynchronous since the \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eCookieMonster\u003c/span\u003e may be backed by an \u003ca href\u003d\"http://en.wikipedia.org/wiki/SQLite\" rel\u003d\"nofollow\"\u003esqlite\u003c/a\u003e database. After doing so, it will ask the request context's \u003ccode\u003eHttpTransactionFactory\u003c/code\u003e to create a \u003ccode\u003eHttpTransaction\u003c/code\u003e. Typically, the \u003ccode\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/http-cache\"\u003eHttpCache\u003c/a\u003e\u003c/code\u003e will be specified as the \u003ccode\u003eHttpTransactionFactory\u003c/code\u003e. The \u003ccode\u003eHttpCache\u003c/code\u003e will create a \u003ccode\u003eHttpCache::Transaction\u003c/code\u003e to handle the HTTP request. The \u003ccode\u003eHttpCache::Transaction\u003c/code\u003e will first check the \u003ccode\u003eHttpCache\u003c/code\u003e (which checks the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache\"\u003edisk cache\u003c/a\u003e) to see if the cache entry already exists. If so, that means that the response was already cached, or a network transaction already exists for this cache entry, so just read from that entry. If the cache entry does not exist, then we create it and ask the \u003ccode\u003eHttpCache\u003c/code\u003e's \u003ccode\u003eHttpNetworkLayer\u003c/code\u003e to create a \u003ccode\u003eHttpNetworkTransaction\u003c/code\u003e to service the request. The \u003ccode\u003eHttpNetworkTransaction\u003c/code\u003e is given a \u003ccode\u003eHttpNetworkSession\u003c/code\u003e which contains the contextual state for performing HTTP requests. Some of this state comes from the \u003ccode\u003eURLRequestContext\u003c/code\u003e.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-HttpNetworkTransaction\" /\u003eHttpNetworkTransaction\u003c/h3\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eclass HttpNetworkSession {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e ...\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e private:\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Shim so we can mock out ClientSockets.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  ClientSocketFactory* const socket_factory_;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Pointer to URLRequestContext's HostResolver.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  HostResolver* const host_resolver_;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e  // Reference to URLRequestContext's ProxyService\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  scoped_refptr\u0026lt;ProxyService\u0026gt; proxy_service_;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  // Contains all the socket pools.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  ClientSocketPoolManager socket_pool_manager_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  // Contains the active SpdySessions.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  scoped_ptr\u0026lt;SpdySessionPool\u0026gt; spdy_session_pool_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  // Handles HttpStream creation.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e  HttpStreamFactory http_stream_factory_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003ccode\u003eHttpNetworkTransaction\u003c/code\u003e asks the \u003ccode\u003eHttpStreamFactory\u003c/code\u003e to create a \u003ccode\u003eHttpStream\u003c/code\u003e.  The \u003ccode\u003eHttpStreamFactory\u003c/code\u003e returns a \u003ccode\u003eHttpStreamRequest\u003c/code\u003e that is supposed to handle all the logic of figuring out how to establish the connection, and once the connection is established, wraps it with a HttpStream subclass that mediates talking directly to the network.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eclass HttpStream {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e public:\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  virtual int SendRequest(...) \u003d 0;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  virtual int ReadResponseHeaders(...) \u003d 0;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  virtual int ReadResponseBody(...) \u003d 0;\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  ...\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCurrently, there are only two main \u003ccode\u003eHttpStream\u003c/code\u003e subclasses: \u003ccode\u003eHttpBasicStream\u003c/code\u003e and \u003ccode\u003eSpdyHttpStream\u003c/code\u003e, although we're planning on creating subclasses for \u003ca href\u003d\"http://en.wikipedia.org/wiki/HTTP_pipelining\" rel\u003d\"nofollow\"\u003eHTTP pipelining\u003c/a\u003e.  \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eHttpBasicStream \u003c/span\u003eassumes it is reading/writing directly to a socket.  \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eSpdyHttpStream \u003c/span\u003ereads and writes to a \u003ccode\u003eSpdyStream\u003c/code\u003e. The network transaction will call methods on the stream, and on completion, will invoke callbacks back to the \u003ccode\u003eHttpCache::Transaction\u003c/code\u003e which will notify the \u003ccode\u003eURLRequestHttpJob\u003c/code\u003e and \u003ccode\u003eURLRequest\u003c/code\u003e as necessary. For the HTTP pathway, the generation and parsing of http requests and responses will be handled by the \u003ccode\u003eHttpStreamParser\u003c/code\u003e. For the SPDY pathway, request and response parsing are handled by \u003ccode\u003eSpdyStream\u003c/code\u003e and \u003ccode\u003eSpdySession\u003c/code\u003e. Based on the HTTP response, the \u003ccode\u003eHttpNetworkTransaction\u003c/code\u003e may need to perform \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/http-authentication\"\u003eHTTP authentication\u003c/a\u003e. This may involve restarting the network transaction.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-HttpStreamFactory\" /\u003eHttpStreamFactory\u003c/h3\u003e\u003cdiv\u003e\u003ccode\u003eHttpStreamFactory\u003c/code\u003e first does proxy resolution to determine whether or not a proxy is needed. The endpoint is set to the URL host or the proxy server. \u003ccode\u003eHttpStreamFactory\u003c/code\u003e then checks the \u003ccode\u003eSpdySessionPool\u003c/code\u003e to see if we have an available \u003ccode\u003eSpdySession\u003c/code\u003e for this endpoint. If not, then the stream factory requests a \"socket\" (TCP/proxy/SSL/etc) from the appropriate pool. If the socket is an SSL socket, then it checks to see if \u003ca href\u003d\"https://tools.ietf.org/id/draft-agl-tls-nextprotoneg-01.txt\" rel\u003d\"nofollow\"\u003eNPN\u003c/a\u003e indicated a protocol (which may be SPDY), and if so, uses the specified protocol. For SPDY, we'll check to see if a \u003ccode\u003eSpdySession\u003c/code\u003e already exists and use that if so, otherwise we'll create a new \u003ccode\u003eSpdySession\u003c/code\u003e from this SSL socket, and create a \u003ccode\u003eSpdyStream\u003c/code\u003e from the \u003ccode\u003eSpdySession\u003c/code\u003e, which we wrap a \u003ccode\u003eSpdyHttpStream\u003c/code\u003e around. For HTTP, we'll simply take the socket and wrap it in a \u003ccode\u003eHttpBasicStream\u003c/code\u003e.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Proxy-Resolution\" /\u003eProxy Resolution\u003c/h4\u003e\u003cdiv\u003e\u003ccode\u003eHttpStreamFactory\u003c/code\u003e queries the \u003ccode\u003eProxyService\u003c/code\u003e to return the \u003ccode\u003eProxyInfo\u003c/code\u003e for the GURL. The proxy service first needs to check if it has an up-to-date proxy configuration. If not, it uses the \u003ccode\u003eProxyConfigService\u003c/code\u003e to query the system for the current proxy settings. If the proxy settings are set to no proxy or a specific proxy, then proxy resolution is simple (we return no proxy or the specific proxy). Otherwise, we need to run a \u003ca href\u003d\"http://en.wikipedia.org/wiki/Proxy_auto-config\" rel\u003d\"nofollow\"\u003ePAC script\u003c/a\u003e to determine the appropriate proxy (or lack thereof). If we don't already have the PAC script, then the proxy settings will indicate we're supposed to use \u003ca href\u003d\"http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol\" rel\u003d\"nofollow\"\u003eWPAD auto-detection\u003c/a\u003e, or a custom PAC url will be specified, and we'll fetch the PAC script with the \u003ccode\u003eProxyScriptFetcher\u003c/code\u003e. Once we have the PAC script, we'll execute it via the \u003ccode\u003eProxyResolver\u003c/code\u003e. Note that we use a shim \u003ccode\u003eMultiThreadedProxyResolver\u003c/code\u003e object to dispatch the PAC script execution to threads, which run a \u003ccode\u003eProxyResolverV8\u003c/code\u003e instance. This is because PAC script execution may block on host resolution. Therefore, in order to prevent one stalled PAC script execution from blocking other proxy resolutions, we allow for executing multiple PAC scripts concurrently (caveat: \u003ca href\u003d\"http://en.wikipedia.org/wiki/V8_(JavaScript_engine)\" rel\u003d\"nofollow\"\u003eV8\u003c/a\u003e is not threadsafe, so we acquire locks for the javascript bindings, so while one V8 instance is blocked on host resolution, it releases the lock so another V8 instance can execute the PAC script to resolve the proxy for a different URL).\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Connection-Management\" /\u003eConnection Management\u003c/h4\u003e\u003cdiv\u003eAfter the \u003ccode\u003eHttpStreamRequest\u003c/code\u003e has determined the appropriate endpoint (URL endpoint or proxy endpoint), it needs to establish a connection. It does so by identifying the appropriate \"socket\" pool and requesting a socket from it. Note that \"socket\" here basically means something that we can read and write to, to send data over the network. An SSL socket is built on top of a transport (\u003ca href\u003d\"http://en.wikipedia.org/wiki/Transmission_Control_Protocol\" rel\u003d\"nofollow\"\u003eTCP\u003c/a\u003e) socket, and encrypts/decrypts the raw TCP data for the user. Different socket types also handle different connection setups, for HTTP/SOCKS proxies, SSL handshakes, etc. Socket pools are designed to be layered, so the various connection setups can be layered on top of other sockets. \u003ccode\u003eHttpStream\u003c/code\u003e can be agnostic of the actual underlying socket type, since it just needs to read and write to the socket. The socket pools perform a variety of functions-- They implement our connections per proxy, per host, and per process limits. Currently these are set to 32 sockets per proxy, 6 sockets per destination host, and 256 sockets per process (not implemented exactly correctly, but good enough). Socket pools also abstract the socket request from the fulfillment, thereby giving us \"late binding\" of sockets. A socket request can be fulfilled by a newly connected socket or an idle socket (\u003ca href\u003d\"http://en.wikipedia.org/wiki/HTTP_persistent_connection\" rel\u003d\"nofollow\"\u003ereused from a previous http transaction\u003c/a\u003e).\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Host-Resolution\" /\u003eHost Resolution\u003c/h4\u003e\u003cdiv\u003eNote that the connection setup for transport sockets not only requires the transport (TCP) handshake, but probably already requires host resolution. \u003ccode\u003eHostResolverImpl\u003c/code\u003e uses assorted mechanisms including \u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\" size\u003d\"2\"\u003egetaddrinfo()\u003c/font\u003e to perform host resolutions, which is a blocking call, so the resolver invokes these calls on unjoined worker threads. Typically host resolution usually involves \u003ca href\u003d\"http://en.wikipedia.org/wiki/Domain_Name_System\" rel\u003d\"nofollow\"\u003eDNS\u003c/a\u003e resolution, but may involve non-DNS namespaces such as \u003ca href\u003d\"http://en.wikipedia.org/wiki/NetBIOS\" rel\u003d\"nofollow\"\u003eNetBIOS\u003c/a\u003e/\u003ca href\u003d\"http://en.wikipedia.org/wiki/Windows_Internet_Name_Service\" rel\u003d\"nofollow\"\u003eWINS\u003c/a\u003e. Note that, as of time of writing, we cap the number of concurrent host resolutions to 8, but are looking to optimize this value. \u003ccode\u003eHostResolverImpl\u003c/code\u003e also contains a \u003ccode\u003eHostCache\u003c/code\u003e which caches up to 1000 hostnames.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-SSL-TLS\" /\u003eSSL/TLS\u003c/h4\u003e\u003cdiv\u003e\u003cdiv\u003eSSL sockets require performing SSL connection setup as well as certificate verification. Except on iOS, Chromium uses \u003ca href\u003d\"https://boringssl.googlesource.com/boringssl/\"\u003eBoringSSL\u003c/a\u003e to handle the SSL connection logic. However, we use platform specific APIs for certificate verification. We are moving towards using a certificate verification cache as well, which will consolidate multiple requests for certificate verification of the same certificate into a single certificate verification job and cache the results for a period of time.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eDanger: Outdated\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eSSLClientSocketNSS\u003c/code\u003e roughly follows this sequence of events (ignoring advanced features like \u003ca href\u003d\"http://tools.ietf.org/html/draft-agl-tls-snapstart-00\" rel\u003d\"nofollow\"\u003eSnap Start\u003c/a\u003e or \u003ca href\u003d\"http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions\" rel\u003d\"nofollow\"\u003eDNSSEC\u003c/a\u003e based certificate verification):\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eConnect() is called. We set up NSS's SSL options based on \u003ccode\u003eSSLConfig\u003c/code\u003e specified configuration or preprocessor macros. Then we kickoff the handshake.\u003c/li\u003e\u003cli\u003eHandshake completes. Assuming we didn't hit any errors, we proceed to verify the server's certificate using \u003ccode\u003eCertVerifier\u003c/code\u003e. Certificate verification may take some amount of time, so \u003ccode\u003eCertVerifier\u003c/code\u003e uses the \u003ccode\u003eWorkerPool\u003c/code\u003e to actually call \u003ccode\u003eX509Certificate::Verify()\u003c/code\u003e, which is implemented using platform specific APIs.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eNote that Chromium has its own NSS patches which support some advanced features which aren't necessarily in the system's NSS installation, such as support for \u003ca href\u003d\"http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00\" rel\u003d\"nofollow\"\u003eNPN\u003c/a\u003e, \u003ca href\u003d\"http://tools.ietf.org/search/draft-bmoeller-tls-falsestart-00\" rel\u003d\"nofollow\"\u003eFalse Start\u003c/a\u003e, Snap Start , \u003ca href\u003d\"http://en.wikipedia.org/wiki/OCSP_Stapling\" rel\u003d\"nofollow\"\u003eOCSP stapling\u003c/a\u003e, etc.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTODO: talk about network change notifications\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2187609824886192973"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2187609824886192973"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2187609824886192973"}],"author":[{"name":{"$t":"William Chan"},"email":{"$t":"willchan@chromium.org"}}],"sites$pageName":{"$t":"network-stack"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4098966978721298714"},"published":{"$t":"2013-09-13T14:35:27.915Z"},"updated":{"$t":"2019-04-13T18:30:53.914Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-13T18:30:51.640Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Build FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:400px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-cbuildbot\"\u003e\u003cstrong\u003e1 \u003c/strong\u003ecbuildbot\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview-of-cbuildbot\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eOverview of cbuildbot\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-add-metadata-to-cbuildbot\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eHow to add metadata to cbuildbot\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-run-processes-in-parallel-chromite.lib.parallel-\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eHow to run processes in parallel (chromite.lib.parallel)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-https:-sites.google.com-a-chromium.org-dev-chromium-os-build-chromite-parallel\"\u003e\u003cstrong\u003e1.4 \u003c/strong\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/build/chromite-parallel\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-is-the-HWTest-phase-stage-orange-\"\u003e\u003cstrong\u003e1.5 \u003c/strong\u003eWhy is the HWTest phase stage 'orange'?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-test-that-my-change-does-not-break-an-incremental-build-\"\u003e\u003cstrong\u003e1.6 \u003c/strong\u003eHow do I test that my change does not break an incremental build?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-In-cbuildbot_config.py-what-does-important-False-mean-\"\u003e\u003cstrong\u003e1.7 \u003c/strong\u003eIn cbuildbot_config.py, what does important\u003dFalse mean?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Google-Storage\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eGoogle Storage\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-bucket-can-I-use-for-testing-\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eWhat bucket can I use for testing?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Portage-Emerge\"\u003e\u003cstrong\u003e3 \u003c/strong\u003ePortage/Emerge\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-force-emerge-to-use-prebuilt-binaries-\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eHow do I force emerge to use prebuilt binaries?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-check-the-USE-flags-for-a-package-I-am-emerging-\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eHow do I check the USE flags for a package I am emerging?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Development-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eDevelopment \u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-should-I-read-first-Where-do-I-start-\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eWhat should I read first/Where do I start?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-can-I-make-changes-depend-on-each-other-with-Cq-Depend-\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eHow can I make changes depend on each other with Cq-Depend?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-create-a-new-bucket-in-gsutil-\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eHow do I create a new bucket in gsutil?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-port-a-new-board-to-Chromium-OS-\"\u003e\u003cstrong\u003e4.4 \u003c/strong\u003eHow do I port a new board to Chromium OS?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Making-changes-to-the-Chromium-browser-on-ChromiumOS-AKA-Simple-Chrome-\"\u003e\u003cstrong\u003e4.5 \u003c/strong\u003eMaking changes to the Chromium browser on ChromiumOS (AKA Simple Chrome)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-install-an-image-on-a-DUT-via-cros-flash-\"\u003e\u003cstrong\u003e4.6 \u003c/strong\u003eHow to install an image on a DUT via cros flash?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h1\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-cbuildbot\" /\u003ecbuildbot\u003c/h1\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview-of-cbuildbot\" /\u003eOverview of cbuildbot\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/build/using-remote-trybots\"\u003ehttps://www.chromium.org/chromium-os/build/using-remote-trybots\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-to-add-metadata-to-cbuildbot\" /\u003eHow to add metadata to cbuildbot\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/build/cbuildbot-metadata-json-tutorial\"\u003ehttps://sites.google.com/a/chromium.org/dev/cbuildbot-metadata-json-tutorial\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-to-run-processes-in-parallel-chromite.lib.parallel-\" /\u003eHow to run processes in parallel (chromite.lib.parallel)\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-https:-sites.google.com-a-chromium.org-dev-chromium-os-build-chromite-parallel\" /\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/build/chromite-parallel\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/build/chromite-parallel\u003c/a\u003e\u003c/div\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Why-is-the-HWTest-phase-stage-orange-\" /\u003eWhy is the HWTest phase stage 'orange'?\u003cbr /\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eThe hardware test phase is 'orange' when it fails with a warning. These warnings occur when a test passed with warnings or after retries. They can also occur with the tests are aborted (see below).\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-test-that-my-change-does-not-break-an-incremental-build-\" /\u003eHow do I test that my change does not break an incremental build?\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eTo test whether your change breaks an incremental build, you will need to do two builds in a row in the same sandbox. You can do this with local tryjobs like the following:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecros tryjob --local -g 1234 chell-incremental\u003cbr /\u003ecros tryjob --local -g 1234 chell-incremental\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-In-cbuildbot_config.py-what-does-important-False-mean-\" /\u003eIn cbuildbot_config.py, what does important\u003dFalse mean?\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eFrom the documentation in cbuildbot_config.py: If important\u003dFalse then this bot cannot cause the tree to turn red\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. Set this to False if you are \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003esetting up a new bot. Once the bot is on the waterfall and is \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003econsistently green, mark the builder as important\u003dTrue.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Google-Storage\" /\u003eGoogle Storage\u003c/h1\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-bucket-can-I-use-for-testing-\" /\u003eWhat bucket can I use for testing?\u003c/h2\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf you are a Googler, you can use gs://chromeos-throw-away-bucket for testing. Keep in mind that the contents can be read or deleted by anyone at Google.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe also have another similar bucket named gs://chromeos-shared-team-bucket . Probably using \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003egs://chromeos-throw-away-bucket makes more sense since it is clear that the contents there can be deleted by anyone at Google.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you are not a Googler, you should create your own bucket in Google Storage. \u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Portage-Emerge\" /\u003ePortage/Emerge\u003c/h1\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-force-emerge-to-use-prebuilt-binaries-\" /\u003eHow do I force emerge to use prebuilt binaries?\u003c/h2\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eemerge -g --usepkgonly\u003cbr /\u003e\u003cbr /\u003e(Note: The --getbinpkg only flag for emerge does not actually work)\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-check-the-USE-flags-for-a-package-I-am-emerging-\" /\u003eHow do I check the USE flags for a package I am emerging?\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003eEmerge will tell you what USE flags are used when the \u003cb\u003e-pv \u003c/b\u003eflags are provided e.g.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eemerge-$BOARD chromeos-chrome -pv\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Development-\" /\u003eDevelopment \u003c/h1\u003e\u003cdiv\u003eFAQ items covering general development questions\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-should-I-read-first-Where-do-I-start-\" /\u003eWhat should I read first/Where do I start?\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/developer_guide.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/developer_guide.md\u003c/a\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-can-I-make-changes-depend-on-each-other-with-Cq-Depend-\" /\u003eHow can I make changes depend on each other with Cq-Depend?\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:359411dde4d9a4a3#TOC-How-do-I-specify-the-dependencies-of-a-change-\" style\u003d\"background-color:transparent;font-size:10pt\" class\u003d\"disabled\"\u003ehttps://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/sheriff-details-chromium-os/commit-queue-overview#TOC-How-do-I-specify-the-dependencies-of-a-change-\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-create-a-new-bucket-in-gsutil-\" /\u003eHow do I create a new bucket in gsutil?\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/gsutil.md#FAQ\"\u003egsutil FAQ\u003c/a\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-port-a-new-board-to-Chromium-OS-\" /\u003eHow do I port a new board to Chromium OS?\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide\u003c/a\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Making-changes-to-the-Chromium-browser-on-ChromiumOS-AKA-Simple-Chrome-\" /\u003eMaking changes to the Chromium browser on ChromiumOS (AKA Simple Chrome)\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md\"\u003e https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-to-install-an-image-on-a-DUT-via-cros-flash-\" /\u003eHow to install an image on a DUT via cros flash?\u003c/h2\u003e\u003cdiv\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/using-the-dev-server/xbuddy-for-devserver\"\u003ehttp://www.chromium.org/chromium-os/build/cros-flash\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8945126227284375934"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/build/faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4098966978721298714"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4098966978721298714"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4098966978721298714"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"faq"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4645030110192955611"},"published":{"$t":"2010-06-18T18:12:18.067Z"},"updated":{"$t":"2019-04-08T15:55:38.208Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-08T15:55:37.083Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Accessibility: Low-Vision Support"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eWe believe that Chrome should provide a complete and satisfying experience to users who have low vision. Here are three of the most common needs, and how they can currently be addressed in Chrome. \r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:400px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-1\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Full-Page-Zoom\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eFull Page Zoom\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adjusting-Font-Face-and-Size\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eAdjusting Font Face and Size\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-High-Contrast-and-Custom-Color-Support\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eHigh Contrast and Custom Color Support\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e \r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Full-Page-Zoom\" /\u003eFull Page Zoom\u003c/h3\u003e\r\n\u003cdiv\u003eIn order to increase or decrease the zoom level of the currently displayed web page, you can use either the keyboard shortcuts (see table below) or access ‘Zoom-\u0026gt;Larger/Normal/Smaller’ in the Chrome Page menu.\u003c/div\u003e\r\n\u003cdiv\u003e \u003c/div\u003e\r\n\u003cdiv style\u003d\"TEXT-ALIGN:left;DISPLAY:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility/xoom_menu.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"BORDER-BOTTOM-STYLE:none;OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1268098422513/developers/design-documents/accessibility/xoom_menu.png\" style\u003d\"PADDING-BOTTOM:0px;BORDER-RIGHT-WIDTH:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e \u003c/div\u003e\r\n\u003cdiv\u003ePage zoom level will be remembered for \u003cem\u003eeach unique domain\u003c/em\u003e, e.g. if you increase zoom for Google Search (http://www.google.com), zoom level will also be increased for Google Calendar (http://www.google.com/calendar). However, since Gmail (http://mail.google.com) is on a different domain, zoom level will remain unchanged in this example.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" cellspacing\u003d\"0\" style\u003d\"BORDER-BOTTOM-COLOR:rgb(136,136,136);BORDER-RIGHT-WIDTH:1px;BORDER-TOP-COLOR:rgb(136,136,136);MARGIN:0px 0px 0px 40px;BORDER-COLLAPSE:collapse;BORDER-TOP-WIDTH:1px;BORDER-BOTTOM-WIDTH:1px;BORDER-RIGHT-COLOR:rgb(136,136,136);BORDER-LEFT-COLOR:rgb(136,136,136);BORDER-LEFT-WIDTH:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"WIDTH:69px;HEIGHT:16px;VERTICAL-ALIGN:top\"\u003e \u003cb\u003eShortcut\u003cspan\u003e   \u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"WIDTH:187px;HEIGHT:16px;VERTICAL-ALIGN:top\"\u003e\u003cb\u003e Action\u003c/b\u003e \u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"WIDTH:69px;HEIGHT:24px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:bold;TEXT-DECORATION:none\"\u003eCtrl++\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"WIDTH:187px;HEIGHT:24px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eIncrease zoom level.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"WIDTH:69px;HEIGHT:20px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:bold;TEXT-DECORATION:none\"\u003eCtrl+-\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"WIDTH:187px;HEIGHT:20px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eDecrease zoom level.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"WIDTH:69px;HEIGHT:20px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:bold;TEXT-DECORATION:none\"\u003eCtrl+0\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"WIDTH:187px;HEIGHT:20px;VERTICAL-ALIGN:top\"\u003e \u003cspan style\u003d\"TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,0);WORD-SPACING:0px\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial,sans-serif,sans;FONT-SIZE:13px\"\u003e\u200b\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eSet zoom level to default level.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Adjusting-Font-Face-and-Size\" /\u003eAdjusting Font Face and Size\u003c/h3\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThere are a number of ways to adjust your font settings. Chrome natively supports changing of Fonts and Languages, including setting font face and size for:\u003c/div\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eSerif Font\u003c/li\u003e\r\n\u003cli\u003eSans-Serif Font\u003c/li\u003e\r\n\u003cli\u003eFixed-width Font\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eTo access these settings, open the Google Chrome Options, select the Under the Hood tab and click the Fonts and Languages button. The dialog that opens allows you to adjust your font settings (note: there is an open bug (\u003ca href\u003d\"http://crbug.com/1040\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003e1040\u003c/a\u003e) to allow these settings to override fonts specified in web pages).\u003c/div\u003e\r\n\u003cdiv\u003e \u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility/chrome_font_and_languages.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"BORDER-BOTTOM-STYLE:none;OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1276802147723/developers/design-documents/accessibility/chrome_font_and_languages.png\" style\u003d\"TEXT-ALIGN:left;PADDING-BOTTOM:0px;BORDER-RIGHT-WIDTH:0px;MARGIN-TOP:5px;PADDING-LEFT:0px;PADDING-RIGHT:0px;ZOOM:1;DISPLAY:block;MARGIN-BOTTOM:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;MARGIN-RIGHT:auto;PADDING-TOP:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"TEXT-ALIGN:left;DISPLAY:block\"\u003e \u003c/div\u003e\r\n\u003cdiv\u003eIn addition, there are a variety of Chrome Extensions that can be used to modify various font properties:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial, sans-serif, sans\"\u003e\u003cspan style\u003d\"FONT-FAMILY:Arial\"\u003e\u003ca href\u003d\"https://chrome.google.com/extensions/detail/jbmkekhehjedonbhoikhhkmlapalklgn\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003eChange Colors\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eOptional font family and font size configuration\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eAbility to add new custom fonts\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial, sans-serif, sans\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ca href\u003d\"https://chrome.google.com/extensions/detail/pofdgleodhojjnibdfnlapkadjepdnka\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003eMinimum Font\u003c/a\u003e\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial, sans-serif, sans\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eAllows you to set the minimum font size on all web pages\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://chrome.google.com/extensions/detail/jgfonhdeiaaflpgphemdgfkjimojblie\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\"\u003eZoomy\u003c/a\u003e\u003c/li\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans,sans-serif;WHITE-SPACE:pre\"\u003eChanges zoom level according to resolution \u0026amp; browser size.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-High-Contrast-and-Custom-Color-Support\" /\u003eHigh Contrast and Custom Color Support\u003c/h3\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"text-indent:0px;border-collapse:separate\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial;font-size:10pt;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;font-style:normal;vertical-align:baseline;font-weight:normal;text-decoration:none\"\u003eThere are a number of steps you can take to configure Chrome to run with custom contrast and colors. Beginning in \u003ca href\u003d\"https://developers.google.com/web/updates/2019/03/nic73\"\u003eChrome 73\u003c/a\u003e, Chrome provides partial support for system-level color schemes. \u003c/span\u003e\u003cfont face\u003d\"Arial\"\u003eDark mode for Chrome's UI is now supported on Mac, and Windows support is on the way.\u003c/font\u003e\u003cbr /\u003e\r\n\u003col style\u003d\"color:rgb(0,0,0);font-family:Arial,sans-serif,sans;font-size:13px;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;list-style-type:decimal\"\u003e\r\n\u003cli style\u003d\"LIST-STYLE-TYPE:decimal;FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eInstall a \u003c/span\u003e\u003ca href\u003d\"http://www.google.com/support/chrome/bin/answer.py?answer\u003d154007\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,153);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:underline\"\u003eChrome Extension\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e which allows you to specify your own custom color combinations, for instance the\u003c/span\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal\"\u003e \u003ca href\u003d\"https://chrome.google.com/extensions/detail/jbmkekhehjedonbhoikhhkmlapalklgn\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003eChange Colors\u003c/a\u003e \u003c/span\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eextension.\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eQuick page action to apply/remove styling overrides on a per page, per domain or global basis (overriding Web page colors)\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eOptional background, text, links and visited links color configuration\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eOption for showing/hiding images\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"FONT-FAMILY:arial,sans-serif;WHITE-SPACE:pre-wrap\"\u003eOption for showing/hiding Flash objects\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli style\u003d\"LIST-STYLE-TYPE:decimal;FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003eUse a \u003c/span\u003e\u003ca href\u003d\"https://tools.google.com/chrome/intl/en/themes/index.html\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,153);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:underline\"\u003eChrome Theme\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e for some control of the color scheme of the Chrome user interface. As an example, the\u003c/span\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal\"\u003e \u003ca href\u003d\"https://chrome.google.com/extensions/detail/okaafmdeogblpdihiidddcnclfhpngcm\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003eBitNova Dark theme\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e offers white text on a black background. The \u003c/span\u003e\u003ca href\u003d\"https://chrome.google.com/extensions\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,153);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:underline\"\u003eChrome Extensions Gallery\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"FONT-STYLE:normal;FONT-FAMILY:Arial;COLOR:rgb(0,0,0);FONT-SIZE:10pt;VERTICAL-ALIGN:baseline;FONT-WEIGHT:normal;TEXT-DECORATION:none\"\u003e offers many other themes, with a variety of color combinations.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial;font-size:10pt;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,0);font-style:normal;vertical-align:baseline;font-weight:normal;text-decoration:none\"\u003e\r\n\u003cdiv style\u003d\"TEXT-ALIGN:left;DISPLAY:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility/custom_colors.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"BORDER-BOTTOM-STYLE:none;OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1268098508985/developers/design-documents/accessibility/custom_colors.png\" style\u003d\"PADDING-BOTTOM:0px;BORDER-RIGHT-WIDTH:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003chr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Other-pages-on-accessibility\" /\u003eOther pages on accessibility\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/keyboard-access\"\u003eAccessibility: Keyboard Access\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/touch-access\" style\u003d\"color:rgb(85,26,139)\"\u003eAccessibility: Touch Access\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/assistive-technology-support\" style\u003d\"OUTLINE-STYLE:none;COLOR:rgb(0,102,204)\"\u003eAccessibility: Screen reader support\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility\" target\u003d\"_blank\"\u003eAccessibility Design Document\u003c/a\u003e (for developers)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/low-vision-support"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4645030110192955611"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4645030110192955611"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4645030110192955611"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"low-vision-support"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5550992383412615950"},"published":{"$t":"2010-06-18T17:51:35.921Z"},"updated":{"$t":"2019-04-08T15:39:01.888Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-08T15:39:00.252Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Accessibility: Keyboard Access"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv\u003eAn important design goal is for Chrome to be fully accessible via the keyboard. Many users with disabilities may be unable to use a mouse or other pointing device, and there are many scenarios where power users prefer keyboard shortcuts.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe majority of users use a combination of the keyboard and mouse, and we don't think that full keyboard access should make things more cumbersome for users who don't need or want every control to be focusable. So, for example, we don't think that most toolbar controls should be part of the Tab traversal.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eOn the other hand, we don't believe that there should be a separate \"accessibility mode\" that enables more keyboard access. We don't believe that users should be segregated; rather, we should strive to find a balance where most users will only use the keyboard shortcuts they choose to learn, while users who rely completely on their keyboard will find the interface easy to navigate without memorizing a separate shortcut for every single command.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Keyboard-Navigation-and-Shortcuts\" /\u003eKeyboard Navigation and Shortcuts\u003c/h3\u003e\r\n\u003cdiv\u003eHere are the keyboard shortcuts that help make Chrome accessible to users who need full keyboard access.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eFirst, there are keys to focus each of the toolbars:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eShift+Alt+T\u003c/b\u003e: Main Toolbar (contains Back, Forward, Reload, etc)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eShift+Alt+B\u003c/b\u003e: Bookmarks Toolbar\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIn addition, pressing \u003cb\u003eF6\u003c/b\u003e or \u003cb\u003eShift+F6\u003c/b\u003e now switches to the next pane, with the available panes in Chrome being:\u003c/div\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eThe web content area (which displays the web page itself)\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cdiv\u003eMain Toolbar\u003c/div\u003e\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cdiv\u003eBookmarks Toolbar\u003c/div\u003e\u003c/li\u003e\u003c/ul\u003eAlso, pressing \u003cb\u003eAlt\u003c/b\u003e or \u003cb\u003eF10\u003c/b\u003e focuses the Chromium menu button in the toolbar, since these keys are normally used to focus the menu bar in a typical Windows application. \r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Toolbar-Navigation\" /\u003eToolbar Navigation\u003c/h4\u003e\r\n\u003cdiv\u003eWhile in a toolbar, you can press \u003cb\u003eTab\u003c/b\u003e, \u003cb\u003eShift+Tab\u003c/b\u003e, \u003cb\u003eHome\u003c/b\u003e (move to first enabled control) and \u003cb\u003eEnd\u003c/b\u003e (move to last enabled control) to navigate to different controls in the toolbar. You can also use the \u003cb\u003eLeft Arrow\u003c/b\u003e and \u003cb\u003eRight Arrow\u003c/b\u003e keys, except notably when the Location Bar / Omnibox has focus, because then those keys are used for text editing. (This is the same behavior as in other Windows applications, like Microsoft Excel.)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003eControls can be activated using either \u003cstrong\u003eSpace\u003c/strong\u003e or \u003cstrong\u003eEnter\u003c/strong\u003e (menu buttons also support \u003cb\u003eD\u003c/b\u003e\u003cstrong\u003eown Arrow\u003c/strong\u003e to open menu, \u003cstrong\u003eEsc\u003c/strong\u003e to close menu). Many controls also have a context menu (a right-click menu), which can be activated using the \u003cb\u003eContext Menu\u003c/b\u003e key on your keyboard, or by pressing \u003cb\u003eShift+F10\u003c/b\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThere is one aspect of toolbar keyboard navigation that is potentially confusing: the Location Bar is normally part of the Tab order, but having focus in the Location Bar doesn't necessarily mean that the entire toolbar is the active pane. In a sense, the Location Bar is a special control that is part of the tab order of several panes. To clarify:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThese keystrokes focus the Location Bar (but do not set focus to the Toolbar pane):\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eTabbing to the Location Bar from the web content.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+L\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eAlt+D\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003eThese keystrokes set focus to the Toolbar pane:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eF6\u003c/b\u003e (focuses the Location Bar)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eAlt+Shift+T\u003c/b\u003e (focuses the leftmost enabled control of the Main Toolbar)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eAlt\u003c/b\u003e (focuses the page menu)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eF10\u003c/b\u003e (focuses the page menu)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe reason for this is to create minimal confusion for users who do not need keyboard access. Users who primarily use the mouse are very unlikely to use \u003cb\u003eF6\u003c/b\u003e, so it's unlikely they will ever end up focusing various controls in the toolbar by accident. On the other hand, users who rely on full keyboard access are used to using \u003cb\u003eF6\u003c/b\u003e to switch between window panes (e.g. in Windows Explorer), so this should be a very easy shortcut to remember.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://chrome.google.com/extensions\" target\u003d\"_blank\"\u003eChrome extensions\u003c/a\u003e can install \u003ca href\u003d\"http://www.google.com/support/chrome/bin/answer.py?answer\u003d154007\" target\u003d\"_blank\"\u003ePage Actions and Browser Actions\u003c/a\u003e in the main toolbar. These are all fully accessible using these keystrokes. Don't forget to try the \u003cb\u003eContext Menu\u003c/b\u003e key for Page Actions and Browser Actions.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe following keys can be used to access the menus:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eAlt\u003c/b\u003e or \u003cb\u003eF10 or Alt+F\u003c/b\u003e puts focus on the Chromium menu button - this corresponds to the key most commonly used to focus the first menu in the menu bar in Windows applications.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIn addition, the following keys can be used to switch tabs, in addition to the shortcuts in the menus:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+1\u003c/b\u003e through \u003cb\u003eCtrl+8\u003c/b\u003e switches to the tab at the specified position number on the tab strip.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+9\u003c/b\u003e switches to the last tab.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+Shift+Tab\u003c/b\u003e or \u003cb\u003eCtrl+PgUp\u003c/b\u003e switches to the previous tab.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+Tab\u003c/b\u003e or \u003cb\u003eCtrl+PgDown\u003c/b\u003e switches to the next tab.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCtrl+W\u003c/b\u003e or \u003cb\u003eCtrl+F4\u003c/b\u003e closes the current tab.\u003c/li\u003e\u003cli\u003e\u003cb\u003eALT-F4 \u003c/b\u003equits the application.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003cdiv\u003eWant more information? See the \u003ca href\u003d\"https://support.google.com/chrome/answer/157179?hl\u003den\"\u003efull list of keyboard shortcuts\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Other-pages-on-accessibility\" /\u003eOther pages on accessibility\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/touch-access\"\u003eAccessiblity: Touch Access\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/low-vision-support\"\u003eAccessibility: Low-Vision Support\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/assistive-technology-support\"\u003eAccessibility: Screen reader support\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/accessibility\" target\u003d\"_blank\"\u003eAccessibility Design Document\u003c/a\u003e (for developers)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/keyboard-access"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5550992383412615950"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5550992383412615950"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5550992383412615950"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"keyboard-access"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8928556566706645481"},"published":{"$t":"2010-06-17T17:41:36.347Z"},"updated":{"$t":"2019-04-05T18:04:29.713Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-05T18:04:27.544Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Turning Off Auto Updates in Google Chrome"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"text-align:left\"\u003eGoogle Chrome on Windows and Mac auto-updates itself on a regular basis.  The auto-updating procedure is performed by Google Update, which is based on the open-source \u003ca href\u003d\"https://github.com/google/omaha\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eOmaha\u003c/a\u003e project.  Auto-updated provide fixes to sometimes critical issues, limiting exposure.\u003c/div\u003e\u003cdiv style\u003d\"text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-top-color:rgb(136,136,136);border-right-color:rgb(136,136,136);border-bottom-color:rgb(136,136,136);border-left-color:rgb(136,136,136);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"text-align:center;width:1057px;height:56px\"\u003e \u003cbr /\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eWarning: Turning off auto-updates should be done with caution.  You may not receive the latest security updates if you do not auto-update.\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eTurning off Auto-Updates on Windows\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:left\"\u003eTo turn off auto-updates of Google Chrome on Windows, you need to instruct Google Update to not update it.  To do this, you can either:\u003c/div\u003e\u003cdiv style\u003d\"text-align:left\"\u003e\u003col\u003e\u003cli\u003eUse the\u003cb\u003e Google Update \u003c/b\u003eADM templates provided \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-templates\"\u003eon this page\u003c/a\u003e or as described in \u003ca href\u003d\"https://support.google.com/chrome/a/answer/6350036\"\u003ethis article\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eSet the value of \u003cspan style\u003d\"font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Courier New,Courier\"\u003eHKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Google\\Update\\\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New,Courier\"\u003eAutoUpdateCheckPeriodMinutes \u003c/span\u003e\u003cspan\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eto the REG_DWORD value of \"0\".\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:12.800000190734863px;font-weight:inherit;font-family:Helvetica Neue,HelveticaNeue,Helvetica,sans-serif;line-height:22px;color:rgb(255,0,0)\"\u003eWarning: To prevent abuse \u003c/span\u003e\u003cspan style\u003d\"font-size:12.800000190734863px;font-family:Helvetica Neue,HelveticaNeue,Helvetica,sans-serif;line-height:22px;color:rgb(255,0,0)\"\u003eof this policy\u003c/span\u003e\u003cspan style\u003d\"font-size:12.800000190734863px;font-weight:inherit;font-family:Helvetica Neue,HelveticaNeue,Helvetica,sans-serif;line-height:22px;color:rgb(255,0,0)\"\u003e, if a device is \u003c/span\u003e\u003cspan style\u003d\"font-size:12.800000190734863px;font-weight:inherit;font-family:Helvetica Neue,HelveticaNeue,Helvetica,sans-serif;line-height:22px;color:rgb(255,0,0)\"\u003enot joined\u003c/span\u003e\u003cspan style\u003d\"font-size:12.800000190734863px;font-weight:inherit;font-family:Helvetica Neue,HelveticaNeue,Helvetica,sans-serif;line-height:22px;color:rgb(255,0,0)\"\u003e to an Active Directory domain, and if this policy has been set to 0 or to a value greater than 77 hours, this setting will not be honored and replaced by 77 hours after August 2014. If you are affected by this, and still want to disable Chrome updates (NOT RECOMMENDED), you may do so by using 'Update policy override' as described \u003ca href\u003d\"https://support.google.com/chrome/a/answer/6350036#Policies\" style\u003d\"color:rgb(17,85,204)\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:left\"\u003eMore information about Google Update's group policy support is \u003ca href\u003d\"https://support.google.com/chrome/a/answer/6350036\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eTurning off Auto-Updates on Mac\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMore information about turning off auto-updates on a Mac network is \u003ca href\u003d\"http://www.google.com/support/installer/bin/answer.py?hl\u003den\u0026amp;answer\u003d147176\u0026amp;ctx\u003dgo\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eTurning off Auto-Updates on Linux\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eGoogle Chrome and Chromium are not auto-updated automatically on Linux; your package manager handles this.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cb\u003eFrequently Asked questions\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: Does Chrome on Linux auto-update too?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: Google Chrome on Linux does not auto-update itself; it relies on your package manager to update it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: Does the open-source Chromium browser auto-update like Chrome?\u003c/b\u003e\u003cbr /\u003eNo.  Chromium does not have its own auto-update process, so if you are deploying Chromium, do you not need to worry about turning off auto-updates.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: How do I know if there is an auto-update happening soon?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: You can subscribe to the blog at \u003ca href\u003d\"https://chromereleases.googleblog.com\"\u003ehttps://chromereleases.googleblog.com\u003c/a\u003e, which lists every dev, beta, and stable release of Google Chrome.  Chromium does not auto-update.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: How often do auto-updates happen?  How many can I expect this year?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: Major version updates to the stable channel of Google Chrome tend to happen about every six weeks, although security fixes can come at any time. See \u003ca href\u003d\"http://blog.chromium.org/2010/07/release-early-release-often.html\"\u003eRelease Early, Release Often\u003c/a\u003e for more information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: Do you have release notes with each version?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: Yes, see the Chrome Enterprise Release Notes. Also, for a granular list of what's changed and links to all the fixes made, see \u003ca href\u003d\"https://chromereleases.googleblog.com\"\u003ehttps://chromereleases.googleblog.com\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: Why would I not want to turn off auto-updates?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: Turning off auto-updates means you may miss an update that includes security fixes, leaving your users at risk.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: Can I turn auto-updates back on?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA: Yes.  Just set the value of the registry key you changed back up to a reasonable number of minutes between update checks (greater than \"0\").\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ:  How would I update my users without turning auto-update back on?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA:  You can deploy the latest MSI, which is available \u003ca href\u003d\"http://www.google.com/chrome/eula.html?msi\u003dtrue\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eQ: I need auto-updates off so I can test new versions of Google Chrome / Chromium before everyone else gets them.  What do you suggest I do?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eA:  Turn off auto-updates via the steps above, and push the group policy to your network.  Then download the latest MSI \u003ca href\u003d\"http://www.google.com/chrome/eula.html?msi\u003dtrue\"\u003ehere\u003c/a\u003e.  Deploy it on your test machines, and do your verification.  Once it is certified, deploy that same MSI on the rest of your network.  And watch for updates on \u003ca href\u003d\"https://chromereleases.googleblog.com\"\u003ehttps://chromereleases.googleblog.com\u003c/a\u003e for new versions of the MSI to test and deploy. Enterprise customers can find additional downloads, such as ADMX templates to manage Chrome policies \u003ca href\u003d\"https://cloud.google.com/chrome-enterprise/browser/download/\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/turning-off-auto-updates"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8928556566706645481"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8928556566706645481"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8928556566706645481"}],"author":[{}],"sites$pageName":{"$t":"turning-off-auto-updates"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7391826154388885705"},"published":{"$t":"2019-04-04T02:33:45.656Z"},"updated":{"$t":"2019-04-04T02:33:45.684Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-04T02:33:45.656Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"652-00166-05_20190308_servo_micro_SCH_0.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7391826154388885705"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2836604984678896805"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servomicro/652-00166-05_20190308_servo_micro_SCH_0.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7391826154388885705"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7391826154388885705"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7391826154388885705"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7391826154388885705"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1990434157143141450"},"published":{"$t":"2012-05-28T22:52:30.574Z"},"updated":{"$t":"2019-04-03T19:08:50.137Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-04-03T19:08:48.292Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"External Contributor Checklist"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eBefore you LGTM a change from a non-chromium.org address, make sure we have the right to accept the contribution:\u003cdiv\u003e\u003cul\u003e\u003cli\u003eDefinition: The \"author\" is the email address that owns the code review request on \r\n\u003ca href\u003d\"https://chromiumcodereview.appspot.com/\"\u003ehttps://chromiumcodereview.appspot.com/\u003c/a\u003e\u003c/li\u003e\u003cli\u003eMake sure the author is already listed in src/AUTHORS. In some cases, the author's company might have a wildcard rule in AUTHORS (eg, *@google.com).\u003c/li\u003e\u003cli\u003eIf the author or his/her company is not listed, the CL should include a new AUTHORS entry. \u003c/li\u003e\u003cul\u003e\u003cli\u003eIf you don't work for Google, find someone who does to review the new entry.\u003c/li\u003e\u003cli\u003eGooglers: To verify that someone has signed the CLA, search for Google CLA signers at \u003ca href\u003d\"https://signcla.corp.google.com/\"\u003ehttps://signcla.corp.google.com/\u003c/a\u003e. \u003c/li\u003e\u003cul\u003e\u003cli\u003eIf there's no entry, ask the person to sign the CLA: \u003ca href\u003d\"https://cla.developers.google.com/\"\u003ehttps://cla.developers.google.com/\u003c/a\u003e (individual or corporate, select 'any other Google project')\u003c/li\u003e\u003cli\u003eIf there's a corporate CLA for the author's company, it must list the person explicitly (or the list of authorized contributors must say something like \"All employees\"). If the author is not on their company's roster, do not accept the change.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003eIf you have any questions or doubts, cc accounts@chromium.org for help. Also, please see this for more information: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/contributing-code/external-contributor-checklist"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1990434157143141450"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1990434157143141450"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1990434157143141450"}],"author":[{"name":{"$t":"Mark Larson"},"email":{"$t":"mal@chromium.org"}}],"sites$pageName":{"$t":"external-contributor-checklist"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2516238876015801286"},"published":{"$t":"2015-05-22T02:12:43.820Z"},"updated":{"$t":"2019-03-20T20:40:33.593Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-20T20:40:31.649Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Touch Firmware Updater"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:350px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bus-overview\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBus overview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Kernel-driver\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eKernel driver\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Userspace-organization-and-scripts\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eUserspace organization and scripts\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Firmware-update-sequence\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eFirmware update sequence\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Error-recovery\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eError recovery\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eTouchpads and touchscreens are among the most sensitive input devices\r\nintegrated into computing systems today. The complexity of touch controllers\r\nhas increased so that touch devices can be thought of as small embedded\r\ndevices, with many features and performance determined by upgradeable firmware.\r\nThroughout development and the lifespan of a Chromebook, firmware updates of\r\nthe touch device may occur. This page provides an overview of how Chrome OS\r\nhandles touch device firmware updates.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bus-overview\" /\u003eBus overview\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eCurrent generation Chromebooks use I2C (and the SMBus variant) as the\r\nunderlying communication bus between the host system (where Chrome OS and the\r\nkernel driver run) and the touch device controller (where the firmware runs).\r\nI2C was chosen because it provides a good balance between power draw,\r\ncomplexity, and bandwidth. The bus is also well-supported on ARM based\r\nplatforms. In addition to I2C for data, an interrupt line is routed from the\r\ntrackpad to the host to signal the kernel driver when it is time to query for\r\nnew data from the device during operation (and optionally signal state\r\ntransitions during a firmware update).\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Kernel-driver\" /\u003eKernel driver\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eMost of the actual work of moving of firmware bits across the bus is done by\r\nthe vendor-specific kernel driver or user-space utility. The driver or utility sends commands to the device to\r\nready it to accept a new firmware payload. Some trackpad vendors refer to this\r\nmode as a “bootloader” mode. The bootloader is a last resort in case the more\r\ncomplex operational mode firmware is corrupted. A trackpad without a valid\r\nfirmware needs to at least be able to accept a working payload via an update.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe driver or utility sends the firmware binary over the i2c bus to the device’s\r\nbootloader, using the vendor-specific protocol.\u003c/p\u003e\u003cp\u003eWhile the protocol from the kernel driver to the touch device for the firmware\r\nupdate is vendor-specific, \u003ca href\u003d\"https://www.kernel.org/doc/Documentation/firmware_class/README\" rel\u003d\"nofollow\"\u003eChrome OS requires that the kernel driver use the request_firmware hotplug\r\ninterface\u003c/a\u003e to expose the same interface to userspace:\u003c/p\u003e\r\n\r\n\u003cp\u003eAt a high level, request_firmware allows the kernel driver to access a file for\r\nread operations at /lib/firmware in the root file system.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe device driver must support the following sysfs attributes for version\r\nmanagement:\u003c/p\u003e\r\n\r\n\u003cul\u003e\r\n \u003cli\u003e \u003cstrong\u003efirmware_version\u003c/strong\u003e or \u003cstrong\u003efw_version\u003c/strong\u003e - identifies the current version number of the firmware loaded on the device,\r\nin the form \u0026lt;\u003cem\u003emajor_version\u003c/em\u003e\u0026gt;.\u0026lt;\u003cem\u003eminor_version\u003c/em\u003e\u0026gt;\r\n \u003c/li\u003e\u003cli\u003e \u003cstrong\u003eproduct_id\u003c/strong\u003e or \u003cstrong\u003ehw_version\u003c/strong\u003e - a unique string that can identify the hardware version in the case that the\r\nsame driver may be used by multiple device variants.\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eFor example, a Chromebook Pixel has two Atmel mXT devices. The hw_version of\r\nthe mXT224SL trackpad is 130.1. The hw_version of the mXT1664S touchscreen is\r\n162.0.\u003c/p\u003e\r\n\r\n\u003cp\u003eFinally, one sysfs attribute must be provided to trigger a firmware update\r\nprogrammatically from user space: \u003c/p\u003e\r\n\r\n\u003cul\u003e\r\n \u003cli\u003e \u003cstrong\u003eupdate_fw\u003c/strong\u003e - should be writable by the root user. It should also be able to accept a\r\ndifferent filename in case more than one device uses the driver on the system,\r\nand therefore, two different firmwares are meant for different targets.\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eThe following example shows how the two Pixel touch devices share the same\r\ndriver, but appear as separate instances in sysfs : \u003c/p\u003e\r\n\r\n\u003cpre\u003eecho “maxtouch-tp.fw” \u0026gt; /sys/bus/i2c/devices/1-004b/update_fw\r\necho “maxtouch-ts.fw” \u0026gt; /sys/bus/i2c/devices/2-004a/update_fw\u003c/pre\u003e\r\n\r\n\u003cp\u003eFor examples, see the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/kernel/+/refs/heads/chromeos-3.4/drivers/input/mouse/cyapa.c\"\u003ecypress\u003c/a\u003e and \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/kernel/+/refs/heads/chromeos-3.4/drivers/input/touchscreen/atmel_mxt_ts.c\"\u003eatmel\u003c/a\u003e drivers in the chromeos-kernel tree.\u003c/p\u003e\u003cp\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eUserspace updater\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp\u003eIf the vendor uses I2C-HID kernel driver, they may use a user-space utility to update the device.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Userspace-organization-and-scripts\" /\u003eUserspace organization and scripts\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eThe touch firmware updater consists of a set of scripts and firmware files. The\r\nfirmware update script is available in a \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/touch_updater.git;a\u003dtree;f\u003dscripts\"\u003eChromium OS source tree\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe files used by the touch firmware updater (as seen on the filesystem of a\r\ntarget system) are organized as follows:\u003c/p\u003e\r\n\r\n\u003cpre\u003e/opt/google/touch/scripts/chromeos-touch-firmware-update.sh\r\n/opt/google/touch/firmware/CYTRA-116002-00_2.9.bin\r\n/lib/firmware/cyapa.bin-\u0026gt;/opt/google/touchpad/firmware/CYTRA-116002-00_2.9.bin\r\n\u003c/pre\u003e\r\n\r\n\r\n\u003cp\u003eNote that \u003ccode\u003e/lib/firmware/cyapa.bin\u003c/code\u003e is a symlink that links to the current latest version of firmware elsewhere in\r\nthe rootfs.\u003c/p\u003e\r\n\r\n\u003cp\u003eOn a production Chrome OS system, the rootfs is protected as a part of Chrome\r\nOS verified boot, so neither the scripts nor the firmware binary can be changed\r\nby the user. Each version of Chrome OS ships with a firmware binary for every\r\ntouch device in the system installed in the rootfs. Following an auto-update,\r\non boot the touch firmware update script probes the device's current firmware\r\nversion and may trigger a firmware update if the current version is not\r\ncompatible. \u003c/p\u003e\r\n\r\n\u003cp\u003eThe name of the firmware binary is used to identify the version of the firmware\r\nbinary by the chromeos-touch-firmwareupdate.sh. It should be in the format : \u0026lt;\u003cem\u003eproduct_id\u003c/em\u003e\u0026gt;_\u0026lt;\u003cem\u003efirmware_version\u003c/em\u003e\u0026gt;.bin\u003c/p\u003e\r\n\r\n\u003cp\u003eIn the above example, the product_id is CYTRA-116002-00, and the version is\r\n2.9.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Firmware-update-sequence\" /\u003eFirmware update sequence\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eThe touch firmware update runs after the kernel device driver has successfully\r\nprobed the touch device.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe chromeos-touch-update upstart job runs before the Chrome OS UI has started.\r\nIt blocks the UI job from starting until a firmware version check and potential\r\nupdate are completed. The UI job is blocked because the touchpad or touchscreen\r\nare nonresponsive for the duration of the update, and during this process a\r\nuser should not be able to interact with the device.\u003c/p\u003e\r\n\r\n\u003cp\u003eFor details, see the \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/touch_updater.git;a\u003dblob;f\u003dscripts/chromeos-touch-update.conf;hb\u003dHEAD\"\u003echromeos-touch-update.conf\u003c/a\u003e job.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe updater also runs as a part of the recovery process from a recovery image\r\nbooted via USB.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Error-recovery\" /\u003eError recovery\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eA typical update requires between 8 and 18 seconds. The firmware update runs\r\nbefore the Chrome OS UI starts (the user sees the splash screen) to prevent the\r\nuser from inadvertently causing the update to fail. \u003c/p\u003e\r\n\r\n\u003cp\u003eHowever, it is still possible that a firmware update might not complete\r\nproperly if the system shuts down due to low battery. In this case, the\r\noperational mode firmware will be corrupted. The next time the device boots, it\r\nwill not be possible to probe the device and have a functional touch device.\u003c/p\u003e\r\n\r\n\u003cp\u003eFor error recovery, it is a requirement for the kernel device driver to\r\nrecognize this condition and probe successfully into a bootloader-only mode.\r\nFrom this state, the driver must be able to perform a forced update to a known\r\ngood firmware. This means the update_fw sysfs property must exist and perform\r\nthe same task in this error condition as during a normal firmware update.\u003c/p\u003e\r\n\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/touch-firmware-updater"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2516238876015801286"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2516238876015801286"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2516238876015801286"}],"author":[{}],"sites$pageName":{"$t":"touch-firmware-updater"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"Xil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3903413214199301128"},"published":{"$t":"2012-09-14T22:34:41.140Z"},"updated":{"$t":"2019-03-18T22:20:14.163Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-18T22:20:12.146Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mac XIB Files"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eCocoa interfaces are typically \u003c/span\u003e\u003ca href\u003d\"https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003ecreated using Xcode's Interface Builder\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. The output of that program produces XIB files, which are XML representations of a user interface. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eChromium does not use XIB files. Do not add new ones.\u003c/font\u003e\u003c/b\u003e\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/mac-xib-files"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3903413214199301128"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3903413214199301128"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3903413214199301128"}],"author":[{"name":{"$t":"Robert Sesek"},"email":{"$t":"rsesek@chromium.org"}}],"sites$pageName":{"$t":"mac-xib-files"},"sites$revision":{"$t":"27"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/606642757429119203"},"published":{"$t":"2019-03-18T20:25:53.470Z"},"updated":{"$t":"2019-03-18T20:25:53.470Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-18T20:25:53.470Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/606642757429119203"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/606642757429119203"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/606642757429119203"}],"author":[{"name":{"$t":"Alex Chromium Pau"},"email":{"$t":"alexpau@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Release","$t":"2018-11-02"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.samsung.com/us/computing/chromebooks/12-14/samsung-chromebook-plus-lte-xe525qbb-k01us/\"\u003eSamsung Chromebook Plus LTE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Nautilus LTE"},{"index":"E","name":"Board name(s)","$t":"nautilus"},{"index":"F","name":"Base board","$t":"poppy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-Y"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"XCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2824765352002440363"},"published":{"$t":"2015-12-07T21:23:34.434Z"},"updated":{"$t":"2019-03-17T22:40:42.741Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-17T22:40:40.492Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Dr. Fuzz"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Lucida Grande,Verdana,Geneva,Arial,sans-serif;font-size:13px;line-height:16.9px;background-color:transparent\"\u003eDr. Fuzz\u003c/b\u003e\u003cspan style\u003d\"font-family:Lucida Grande,Verdana,Geneva,Arial,sans-serif;font-size:13px;line-height:16.9px;background-color:transparent\"\u003e is no longer supported. It depended on Dr. Memory, which we stopped supporting in \u003ca href\u003d\"https://crbug.com/655521\"\u003ehttps://crbug.com/655521\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/dr-fuzz"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2824765352002440363"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2824765352002440363"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2824765352002440363"}],"author":[{"name":{"$t":"Qin Zhao"},"email":{"$t":"zhaoqin@chromium.org"}}],"sites$pageName":{"$t":"dr-fuzz"},"sites$revision":{"$t":"15"}},{"gd$etag":"\"Wyl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7612561908054597274"},"published":{"$t":"2013-04-02T14:02:35.734Z"},"updated":{"$t":"2019-03-14T20:40:05.281Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-14T20:40:02.644Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autotest Design Patterns"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:300px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adding-retries-to-Flaky-tests\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eAdding retries to Flaky tests\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Wrapping-a-GTest-test-in-Autotest\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eWrapping a GTest test in Autotest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Wrapping-a-Browerstest-in-Autotest\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWrapping a Browerstest in Autotest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Wrapping-a-Telemetry-test-in-Autotest\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eWrapping a Telemetry test in Autotest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Locally-Testing-a-Wrapped-Telemetry-Test:\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eLocally Testing a Wrapped Telemetry Test:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Logging-into-Chrome-from-an-Autotest-using-Telemetry-\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eLogging into Chrome from an Autotest (using Telemetry)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Rebooting-a-machine-in-a-server-side-test\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eRebooting a machine in a server-side test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Running-a-client-side-test-as-part-of-a-server-side-test\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eRunning a client side test as part of a server side test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-code-to-automatically-generate-a-label-for-a-DUT\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eWriting code to automatically generate a label for a DUT\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Use-Chrome-Driver-in-ChromeOS-Autotest-Test\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eUse Chrome Driver in ChromeOS Autotest Test\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-About-Chrome-Driver\"\u003e\u003cstrong\u003e10.1 \u003c/strong\u003eAbout Chrome Driver\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chrome-Driver-Binary\"\u003e\u003cstrong\u003e10.2 \u003c/strong\u003eChrome Driver Binary\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-use-Chrome-Driver-in-an-Autotest-test\"\u003e\u003cstrong\u003e10.3 \u003c/strong\u003eHow to use Chrome Driver in an Autotest test\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis is a collection of patterns to help aid test developers in finding useful parts of Autotest and common pathways when writing tests.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Adding-retries-to-Flaky-tests\" /\u003eAdding retries to Flaky tests\u003c/h2\u003e\r\n\u003cdiv\u003eWe have a mechanism to retry tests that have flaky failures. A retries count can be specified, and a failing test\u003cspan style\u003d\"font-size:10pt\"\u003e will be re-attempted until it either passes or the number of failed retries reaches the retry count, in which case the test will be considered failed.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eTo add retries to your test, you simply need to a\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003edd a \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eJOB_RETRIES \u003d N\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e attribute to the control file for the test you would like to retry, where \u003c/font\u003e\u003cfont style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eN\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e is an integer giving the maximum number of times the test should be retried.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont color\u003d\"#444444\" size\u003d\"2\" style\u003d\"background-color:rgb(243,243,243)\"\u003eNote that a previous method of retrying flaky tests was to use the \u003cfont face\u003d\"courier new, monospace\"\u003eRETRIES\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e attribute. While this attribute is no longer in use, one might find this in commits merged in or before Aug 2018. \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d873716\"\u003eThis bug\u003c/a\u003e tracks the migration from \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eRETRIES\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e to \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eJOB_RETRIES.\u003c/font\u003e\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Wrapping-a-GTest-test-in-Autotest\" /\u003eWrapping a GTest test in Autotest\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Wrapping-a-Browerstest-in-Autotest\" /\u003eWrapping a Browerstest in Autotest\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Wrapping-a-Telemetry-test-in-Autotest\" /\u003eWrapping a Telemetry test in Autotest\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eTelemetry is replacing Pyauto as the new performance testing framework for Chrome as well as the new key way to write tests that interact with the UI. Writing a test that uses telemetry is a 2 step process:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eWrite a telemetry test or benchmark in the chromium source.\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eTelemetry's source code, tests, and performance benchmarks are all platform independent. Thus they all exist within the chromium not the chromium-os source.\u003c/li\u003e\r\n\u003cli\u003eIf one wants to write a new test, they first should add it as a new telemetry test.\u003c/li\u003e\r\n\u003cli\u003eThey can run these tests locally against their Chrome-OS machines but provided the arguments --browser\u003dcros-chrome and --remote\u003d\u0026lt;IP\u0026gt; to the telemetry run_tests script that kicks off your new tests.\u003c/li\u003e\r\n\u003cli\u003eOnce the test works and is checked in, it can be ran as a new autotest test.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eIt will take a day or two for the chrome tip-of-tree to be rev-ed into the next build \u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003ePlease see \u003ca href\u003d\"http://dev.chromium.org/developers/telemetry\"\u003ehttp://dev.chromium.org/developers/telemetry\u003c/a\u003e for more information.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eWrite an autotest test to kick off the new telemetry test.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eOnce your new telemetry test/benchmark is checked into chrome and working you need to write an autotest server-side test to kick it off.\u003c/li\u003e\r\n\u003cli\u003eIn your new test script you need the following code:\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003efrom autotest_lib.server.cros import telemetry_runner\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\r\n\u003cdiv\u003edef run_once(self, host\u003dNone):\u003c/div\u003e\r\n\u003cdiv\u003e        \"\"\"Run the telemetry scrolling benchmark.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        @param host: host we are running telemetry on.\u003c/div\u003e\r\n\u003cdiv\u003e        \"\"\"\u003c/div\u003e\r\n\u003cdiv\u003e        telemetry \u003d telemetry_runner.TelemetryRunner(host)\u003c/div\u003e\r\n\u003cdiv\u003e        result \u003d telemetry.run_telemetry_test('my_new_telemetry_test')\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        \u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        # OR\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        result \u003d telemetry.run_telemetry_benchmark('my_new_telemetry_benchmark', 'my_page_set')\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        # If collecting performance keyvals to be sent to the perf database:\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e        \u003cspan style\u003d\"line-height:1;font-size:10pt\"\u003eresult \u003d telemetry.run_telemetry_benchmark('my_new_telemetry_benchmark', 'my_page_set', keyval_writer\u003dself)\u003c/span\u003e\u003c/div\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003eAlternatively there currently exists a telemetry_benchmarks test and to add a new benchmark you simple need to add a new control file to this test. I.E. for octane, you add a control file named control.octane and kick off the telemetry_benchmarks test with the current parameters:\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003edef run_benchmark(machine):\u003cbr /\u003e\r\n    host \u003d hosts.create_host(machine)\u003cbr /\u003e\r\n    job.run_test(\"telemetry_benchmarks\", host\u003dhost, benchmark\u003d\"octane\", page_sets\u003d[\"octane.json\"])\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nparrallel_simple(run_benchmark, machine)\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cul /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Locally-Testing-a-Wrapped-Telemetry-Test:\" /\u003e\u003cfont size\u003d\"4\"\u003eLocally Testing a Wrapped Telemetry Test:\u003c/font\u003e\u003c/h2\u003e\r\n\u003cdiv\u003eBecause the telemetry runner code requires the full lab infrastructure, you need to set up a local autotest frontend and devserver in order to locally test your telemetry changes.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eFirst set up a local AFE and database by following the instructions here: \u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq/setup-autotest-server\"\u003ehttp://www.chromium.org/chromium-os/testing/autotest-developer-faq/setup-autotest-server\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eKick off a local devserver.\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003ecd src/platform/dev # From you local chromium-os checkout\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# Kick off the devserver\u003cbr /\u003e\r\n./devserver.py --static_dir\u003dstatic\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cul /\u003e\r\n\u003c/div\u003e\r\n\r\n\u003c/li\u003e\r\n\u003cli\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003eEdit your local AFE to use your local devserver.\u003c/font\u003e\u003c/li\u003e\r\n\u003col\u003e\u003cli\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003eAdd the following to src/third_party/autotest/files/shadow_config.ini:\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e[CROS]\u003cbr /\u003e\r\ndev_server: http://[YOUR IP ADDRESS]:8080\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cul /\u003e\r\n\u003c/div\u003e\r\n\r\n\u003c/font\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cli\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003eRestart apache and kick off the scheduler:\u003c/font\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003esudo /etc/init.d/apache2 restart\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n/usr/local/autotest/scheduler/monitor_db.py /usr/local/autotest/results\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003c/li\u003e\r\n\u003cli\u003eAdd your device to your setup (this requires you to be able to log into your machine as root).\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003esrc/third_party/autotest/files/cli/atest host create [ip of your host]\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cul /\u003e\r\n\u003c/div\u003e\r\n\r\n\u003c/li\u003e\r\n\u003cli\u003eSetup a device with the image you want (important as the database will label your machine with its current image). Do this by kicking off the dummy suite.\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003esrc/third_party/autotest/files/site_utils/run_suite.py --board\u003d[board] --build\u003d[image you want to use] --suite\u003ddummy\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cul /\u003e\r\n\u003c/div\u003e\r\n\r\n\u003c/li\u003e\r\n\u003cli\u003eNow you should be able to kick off your server side telemetry tests through the AFE (go to localhost in your browser)! But in case your new test doesn't show up, run test importer. Then refresh the create job's page with cntl+shift+r\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003esrc/third_party/autotest/files/utils/test_importer.py\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\nNote that the test will try to ssh to the dev_server, so make sure that 'ssh YOUR_IP_ADDRESS' works without prompting a password. If it doesn't, you'll need to setup public keys for your local machine. Following these steps:\r\n\u003col\u003e\r\n\u003cli\u003eFirst generate RSA ssh keys, see \u003ca href\u003d\"https://help.github.com/articles/generating-ssh-keys\" style\u003d\"color:rgb(17,85,204);font-family:arial,sans-serif\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ethis link\u003c/a\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003e if you don't know how to. Assume you've created ~/.ssh/id_rsa,pub and ~/.ssh/id_rsa\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Add the following to ~/.ssh/config\u003c/span\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003eHost YOUR_IP_ADDRESS\u003cbr /\u003e\r\n User YOUR_USER_NAME   \u003cbr /\u003e\r\nIdentityFile /path/to/home/.ssh/id_rsa\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Add the content of ~/.ssh/id_rsa to ~/.ssh/authorized_keys\u003c/span\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003ecat ~/.ssh/id_rsa \u0026gt;\u0026gt; ~/.ssh/authorized_keys\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Restart ssh-agent\u003c/span\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003eusername@localhost~$ killall ssh-agent; eval `ssh-agent`\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Allow ssh to your local machine using RSA keys\u003c/span\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eusername@localhost\u003c/span\u003e~$ sudo vim /etc/ssh/sshd_config\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# Turn on RSAAuthentication\u003cbr /\u003e\r\nRSAAuthentication yes\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Restart ssh server\u003c/span\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eusername@localhost\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e~$ \u003c/span\u003esudo service ssh restart\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e Test you can ssh to your local machine without password\u003c/span\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eusername@localhost\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e~$ \u003c/span\u003essh YOUR_IP_ADDRESS\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Logging-into-Chrome-from-an-Autotest-using-Telemetry-\" /\u003e\u003cfont size\u003d\"4\"\u003eLogging into Chrome from an Autotest (using Telemetry)\u003c/font\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eFrom an Autotest, you can use Telemetry to log into and out of Chrome using context management in Python (the \"with/as\" construct).  To do so, your autotest must include the following import:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003efrom autotest_lib.client.common_lib.cros import chrome\u003c/code\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eand then use the \"with/as\" construct like so:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003ewith chrome.Chrome() as cr:\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e    do_stuff()  # Will be logged into Chrome here.\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e# Will be logged out at this point.\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eIn this example, \u003cfont face\u003d\"courier new, monospace\"\u003ecr\u003c/font\u003e is a Telemetry Browser object.  Wrapping your code inside of a \"with/as\" ensures that Chrome will be logged in at the start of the construct, and logged out at the end of the construct.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Rebooting-a-machine-in-a-server-side-test\" /\u003eRebooting a machine in a server-side test\u003c/h2\u003e\r\n\u003cdiv\u003eThis handles the simple reboot case:\r\n\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003edef run_once(self, host\u003dNone):\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    host.reboot()\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"line-height:1;font-size:10pt\"\u003e    # If the reboot fails, it will raise \u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1;font-size:10pt\"\u003e\u003ccode\u003eerror.AutoservRebootError\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1;font-size:10pt\"\u003e\u003ccode\u003e    # If you need to recover from a reboot failure, note that calls\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1;font-size:10pt\"\u003e\u003ccode\u003e    # to host.run() will almost certainly fail with a timeout.\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have custom code that brings the DUT down, and then brings it back up again, you will need to use a slightly different flow:\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003edef run_once(self, host\u003dNone):\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    boot_id \u003d host.get_boot_id()\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    self._trigger_complicated_dut_restart()\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    host.wait_for_restart(old_boot_id\u003dboot_id)\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Running-a-client-side-test-as-part-of-a-server-side-test\" /\u003eRunning a client side test as part of a server side test\u003c/h2\u003e\r\n\u003cdiv\u003eInside a server job you can utilize the host object to create a client object to run tests.\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003edef run_once(self, host, job_repo_url\u003dNone):\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    client_at \u003d autotest.Autotest(host)\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    client_at.run_test('sleeptest')\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e*The status of this test is communicated through the status.log, if this test fails, the overall run of the job will be considered a failure.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Writing-code-to-automatically-generate-a-label-for-a-DUT\" /\u003eWriting code to automatically generate a label for a DUT\u003c/h2\u003e\u003cdiv\u003eMany tests have requirements for specific hardware characteristics, specified by setting DEPENDENCIES.  So, imagine there's a new \u003ci\u003efubar\u003c/i\u003e class of device present on some new hardware.  You have tests that exercise the driver for the new devices.  Obviously, your test shouldn't run unless a \u003ci\u003efubar\u003c/i\u003e device is present.  So, your control file will say this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eDEPENDENCIES \u003d \"fubar\"\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eAlternatively, imagine that there are three kinds of \u003ci\u003efubar\u003c/i\u003e, types A, B, with the possibility of other types that might be added in future.  There are boards with types A and B to be tested.  You then have two control files, one for each type.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor Type A:\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eDEPENDENCIES \u003d \"fubar_type:type_a\"\u003c/code\u003e\u003cbr /\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eFor Type B:\u003cbr /\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eDEPENDENCIES \u003d \"fubar_type:type_b\"\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThese hardware characteristics are meant be detected automatically when the DUT is added into the lab database.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  To make the detection happen, you have to write detection code.  Here's how to do it.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe detection function must be added as a method in class \u003ccode\u003eCrosHost\u003c/code\u003e, found in file \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eserver/hosts/cros_host.py.  The method must be decorated with \u003ccode\u003e@label_decorator\u003c/code\u003e.  The return value is a string with the label name as it will appear in the \u003ccode\u003eDEPENDENCIES\u003c/code\u003e setting.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eA sample of a simple binary label:\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e@label_decorator('fubar')\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003edef has_fubar(self):\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    result \u003d self.run('test -d /sys/class/fubar', ignore_status\u003dTrue)\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    if result.exit_code !\u003d 0:\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e        return None\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    return 'fubar'\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eA sample of a label with multiple values:\u003c/span\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e@label_decorator('fubar_type')\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003edef get_fubar_type(self):\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    result \u003d self.run('get_fubar_type', ignore_status\u003dTrue)\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    typestring \u003d result.stdout.strip()\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    if typestring \u003d\u003d 'Type A':\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e        return 'fubar_type:type_a'\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    if typestring \u003d\u003d 'Type B':\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e        return 'fubar_type:type_b'\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    # typestring 'Type C' is a proposed industry standard, but\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e    # it hasn't been finalized.  There may be other as yet\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e    # unknown types\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:1;font-size:10pt\"\u003e in the future.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e    return None\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOne point about labels with multiple values bears emphasis:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIt may be that you will find that some valid values of a label aren't yet needed for any test.  In that case, return \u003ccode\u003eNone\u003c/code\u003e for the unused case.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  \u003c/span\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003eDo not return a label value that is not needed by any existing test.\u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e Generally, adding labels is easy, but removing labels is hard.  So, don't create a label name until you know \u003c/span\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003eexactly\u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e where and how it will be used.\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Use-Chrome-Driver-in-ChromeOS-Autotest-Test\" /\u003eUse Chrome Driver in ChromeOS Autotest Test\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-About-Chrome-Driver\" /\u003e\u003cspan style\u003d\"font-size:21px;font-family:Trebuchet MS;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eAbout Chrome Driver\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Driver is a standalone server which implements WebDriver's wire protocol for Chromium. Through Chrome Driver, you can easily interact with Chromium browser with the power of browser automation provided by WebDriver. A list of WebDriver calls you can make can be found in \u003c/span\u003e\u003ca href\u003d\"http://selenium.googlecode.com/svn/trunk/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSelenium 2.0 Documentation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Some useful calls include:\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2999999523162842;margin-top:0pt;margin-bottom:0pt;text-align:justify\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"http://selenium.googlecode.com/svn/trunk/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html#WebDriver.get\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);font-weight:bold;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eget\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eurl\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e): Loads a web page in the current browser session.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2999999523162842;margin-top:2pt;margin-bottom:8pt;text-align:justify\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"http://selenium.googlecode.com/svn/trunk/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html#WebDriver.execute_script\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);font-weight:bold;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eexecute_script\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003escript\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e*args\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e): Synchronously Executes JavaScript in the current window/frame.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2999999523162842;margin-top:2pt;margin-bottom:8pt;text-align:justify\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"http://selenium.googlecode.com/svn/trunk/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html#WebDriver.find_element_by_name\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);font-weight:bold;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003efind_element_by_name\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e): Finds an element by name.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chrome-Driver-Binary\" /\u003e\u003cspan style\u003d\"font-size:21px;font-family:Trebuchet MS;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Driver Binary\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAll ChromeOS test images shall have Chrome Driver binary installed in /usr/local/chromedriver/. The binary is updated to the same version of Chrome in that test image. That is, you will always be using the latest build of Chrome Driver. \u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIf your test expects to run against a “stable” build of Chrome Driver binary, you will need to write your own code in your test to download the desired binary and replace the binary in /usr/local/chromedriver/.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-to-use-Chrome-Driver-in-an-Autotest-test\" /\u003e\u003cspan style\u003d\"font-size:21px;font-family:Trebuchet MS;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eHow to use Chrome Driver in an Autotest test\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWriting a test that uses Chrome Driver to interact with Chrome is easy. There is \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/client/common_lib/cros/chromedriver.py\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ea wrapper class\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for using Chrome Driver available in ChromeOS/Autotest. The wrapper class, as a context manager type, and handles the following tasks for you:\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eLogs in ChromeOS using Telemetry.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eStarts Chrome Driver with Remote mode on the Device under Test (DUT) and connects  to the remote debug port of the Chrome instance after log in.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eExposes a driver instance for you to make any Chrome Driver calls.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eShutdowns Chrome Driver process, and logs out of ChromeOS.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo write a test, you can follow the example of test \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/client/site_tests/desktopui_UrlFetchWithChromeDriver/desktopui_UrlFetchWithChromeDriver.py\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003edesktopui_UrlFetchWithChromeDriver\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. All you need to do to get started are basically:\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eimport the wrapper class\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(0,0,136);background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003efrom\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e autotest_lib\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eclient\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003ecommon_lib\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003ecros \u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(0,0,136);background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eimport\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:rgb(238,238,238);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e chromedriver\u003c/code\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003col start\u003d\"2\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eCreate an instance of the Chrome Driver, and make calls.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003c/span\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\r\n\u003cp style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(0,0,136);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003ewith\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e chromedriver\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003echromedriver\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e()\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(0,0,136);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eas\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e chromedriver_instance\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e:\u003c/code\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e    \u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003edriver \u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e\u003d\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e chromedriver_instance\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003edriver\u003c/code\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cp style\u003d\"line-height:1.5;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e    # Here you can make standard Chrome Driver calls through the driver instance.\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/span\u003e\r\n\u003cp\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e     # For example, browse a given url with |driver.get(url)|\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-design-patterns"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7612561908054597274"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7612561908054597274"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7612561908054597274"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"autotest-design-patterns"},"sites$revision":{"$t":"32"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5620971037140896531"},"published":{"$t":"2019-01-15T21:54:05.861Z"},"updated":{"$t":"2019-03-13T01:38:16.990Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-13T01:38:16.990Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5620971037140896531"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5620971037140896531"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5620971037140896531"}],"author":[{"name":{"$t":"Dan Jaklich"},"email":{"$t":"djaklich@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2018-11-26"},{"index":"B","name":"OEM","$t":"Google"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eGoogle Pixel Slate\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Nocturne"},{"index":"E","name":"Board name(s)","$t":"nocturne"},{"index":"F","name":"Base board","$t":"poppy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-Y"},{"index":"K","name":"Form Factor","$t":"Chromeblet"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":"Left Port"},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3140781041265212642"},"published":{"$t":"2019-03-12T13:07:54.762Z"},"updated":{"$t":"2019-03-12T19:07:12.019Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-12T19:07:10.012Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Animation Worklet"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:0px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eAnimation Worklet is a new primitive that provides extensibility for web animations and enables high performance scripted animations that can run on dedicated thread. The feature is developed as part of the \u003c/font\u003e\u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/wiki\" style\u003d\"font-size:medium;background-color:transparent;color:rgb(3,102,214)\" rel\u003d\"nofollow\"\u003eCSS Houdini task force\u003c/a\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:0px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol\"\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eThe Animation Worklet API provides a method to create scripted animations that control a set of animation effects. These animations are executed inside an isolated execution environment,\u003c/span\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003e \u003c/span\u003e\u003cem style\u003d\"font-size:medium;background-color:transparent\"\u003eworklet\u003c/em\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003ewhich makes it possible for browser  \u003c/span\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eto run such animations in their own dedicated thread to provide a degree of performance isolation from main thread. Worklet animations may be created and controlled via  Web Animations API. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium\"\u003eAnimation Worklet\u003c/span\u003e\u003cfont size\u003d\"3\" style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e combined with other new features such as \u003c/span\u003e\u003ca href\u003d\"https://wicg.github.io/scroll-animations/\" rel\u003d\"nofollow\" style\u003d\"background-color:transparent;color:rgb(3,102,214)\"\u003eScrollTimeline\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/issues/834#issuecomment-470579488\" style\u003d\"background-color:transparent;color:rgb(3,102,214)\" rel\u003d\"nofollow\"\u003eInput in Worklets\u003c/a\u003e, \u003cspan style\u003d\"background-color:transparent\"\u003ecan allow many currently interactive main-thread rAF-based animations to move off main thread which improve smoothness.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:0px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cul style\u003d\"margin-bottom:16px;margin-top:0px;padding-left:2em;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol\"\u003e\u003cli\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003ca href\u003d\"https://drafts.css-houdini.org/css-animationworklet/\" rel\u003d\"nofollow\"\u003e\u003cfont size\u003d\"3\"\u003eSpecification\u003c/font\u003e\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0.25em\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/blob/master/css-animationworklet/README.md\" style\u003d\"background-color:transparent;color:rgb(3,102,214)\" rel\u003d\"nofollow\"\u003e\u003cfont size\u003d\"3\"\u003eExplainer\u003c/font\u003e\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0.25em\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003ca href\u003d\"https://github.com/w3c/css-houdini-drafts/blob/master/css-animationworklet/principles.md\" style\u003d\"background-color:transparent;color:rgb(3,102,214)\" rel\u003d\"nofollow\"\u003e\u003cfont size\u003d\"3\"\u003eDesign Principles and Goals\u003c/font\u003e\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0.25em\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003cfont size\u003d\"3\"\u003eTests: \u003ca href\u003d\"https://github.com/web-platform-tests/wpt/tree/master/animation-worklet\" style\u003d\"background-color:transparent;color:rgb(3,102,214)\" rel\u003d\"nofollow\"\u003ehttps://github.com/web-platform-tests/wpt/tree/master/animation-worklet\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0.25em\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003cfont size\u003d\"3\"\u003eExample codes \u003ca href\u003d\"https://googlechromelabs.github.io/houdini-samples/\" rel\u003d\"nofollow\" style\u003d\"color:rgb(3,102,214);background-color:transparent\"\u003e1\u003c/a\u003e, \u003ca href\u003d\"https://aw-playground.glitch.me/\" rel\u003d\"nofollow\" style\u003d\"color:rgb(3,102,214);background-color:transparent\"\u003e2\u003c/a\u003e, \u003ca href\u003d\"https://houdini.glitch.me/animation\" rel\u003d\"nofollow\"\u003e3\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0.25em\"\u003e\u003cp style\u003d\"margin-bottom:16px;margin-top:16px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1MdpvGtnK_A2kTzLeTd07NUevMON2WBRn5wirxWEFd2w/edit?usp\u003dsharing\"\u003eBlink Design Document\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\" size\u003d\"4\"\u003eCurrent Status\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\" size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\" size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\"\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"font-size:large;border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"width:260.013px;height:20.0134px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e Milestone\u003c/font\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:295.013px;height:20.0134px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e Status\u003cspan\u003e   \u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:1222.01px;height:20.0134px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e Key features\u003c/font\u003e\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:260.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Animation Worklet Prototype\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:295.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003eDone\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:1222.01px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Scripted custom animation, single effect, only fast properties, off main-thread (using compositor thread).\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:260.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Animation Worklet \u003ca href\u003d\"https://developers.google.com/web/updates/2018/10/animation-worklet\" rel\u003d\"nofollow\" style\u003d\"color:rgb(3,102,214);background-color:transparent\"\u003eOrigin Trial\u003c/a\u003e\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:295.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003eIn progress (\u003ca href\u003d\"https://docs.google.com/forms/d/e/1FAIpQLSfO0_ptFl8r8G0UFhT0xhV17eabG-erUWBDiKSRDTqEZ_9ULQ/viewform\" rel\u003d\"nofollow\" style\u003d\"color:rgb(3,102,214);background-color:transparent\"\u003esignup\u003c/a\u003e)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:1222.01px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Scroll input (via ScrollTimeline), basic web-animation controls (play/cancel), move to dedicated thread, optimized performance.\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:260.013px;height:31.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Animation Worklet V1 - MVP\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:295.013px;height:31.0134px\"\u003e\u003cfont size\u003d\"3\"\u003eScheduled for M75\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:1222.01px;height:31.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Animate all properties (slow path ones runs in sync with main thread), sophisticated scheduling so we do not block compositor thread, improved scroll timeline integration.\u003cspan\u003e    \u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:260.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003eAnimation Worklet V2  \u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:295.013px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003eTBD\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:1222.01px;height:26.0134px\"\u003e\u003cfont size\u003d\"3\"\u003e Pointer input via Events, multi-input animation, support GroupEffects, improved integration with Paint Worklet.\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/font\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cfont color\u003d\"#24292e\" face\u003d\"-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4975786110605006351"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/animation-worklet"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3140781041265212642"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3140781041265212642"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3140781041265212642"}],"author":[{"name":{"$t":"Majid Valipour"},"email":{"$t":"majidvp@chromium.org"}}],"sites$pageName":{"$t":"animation-worklet"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8922992497770397830"},"published":{"$t":"2019-03-07T14:52:47.481Z"},"updated":{"$t":"2019-03-07T14:52:47.517Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-07T14:52:47.481Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"mount_event_propagation.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8922992497770397830"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2882457089070302161"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide/chromium-os-sandboxing/mount_event_propagation.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8922992497770397830"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8922992497770397830"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8922992497770397830"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8922992497770397830"}],"author":[{"name":{"$t":"Jorge Lucangeli Obes"},"email":{"$t":"jorgelo@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"XCl7JmA0\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3050195328525704777"},"published":{"$t":"2010-07-05T21:18:57.925Z"},"updated":{"$t":"2019-03-05T22:26:26.432Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-05T22:26:24.437Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Pepper plugin implementation"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis document provides a quick reference for PPAPI integration in Chromium.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you're adding a new API, see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/pepper-api-best-practices\"\u003ePepper API Best Practices\u003c/a\u003e for helpful guidelines and our process is documented in \u003ca href\u003d\"https://docs.google.com/document/d/1sjR0ZlDFVaxnKYdYCeLShumcaeYYSC_CgTM05gKcfXs/edit#heading\u003dh.y526gzy584nh\"\u003ePepper API Proposals\u003c/a\u003e.\u003cbr /\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Quick-reference-to-important-code-locations\" /\u003eQuick reference to important code locations\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi\u003c/font\u003e — Root PPAPI code.\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eapi\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e —\u003c/span\u003e IDL versions of the interfaces.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ec\u003c/font\u003e — Public C binary interface (generated by the IDL, checked into the tree)\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecpp\u003c/font\u003e — Convenience C++ wrapper around the C interface.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003egenerators\u003c/font\u003e — the IDL-to-C compiler\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ehost\u003c/font\u003e — code used in content and chrome to implement the backends for the various resources.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003enative_client\u003c/font\u003e — The NaCl trusted plugin\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eproxy\u003c/font\u003e — Chrome IPC-based proxy\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003etests\u003c/font\u003e — Source code for the unit tests.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eshared_impl\u003c/font\u003e — Contains implementations for Pepper objects that we want to share between the proxied (\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/proxy\u003c/font\u003e) and the in-process version (\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/renderer/pepper\u003c/font\u003e).\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ethunk\u003c/font\u003e — Converts the C PPAPI calls from the plugin into C++ for the browser implementation.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:10pt\"\u003echrome/browser/renderer_host/pepper/pepper_*_host.* \u003c/font\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e— Backend (\"host\") implementations of new-style resources in the Chrome browser process.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome/renderer/pepper/pepper_*_host.*\u003c/font\u003e — Backend (\"host\") implementations of new-style resources in the Chrome renderer process.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/renderer/pepper/ppb_*_impl.*\u003c/font\u003e — Implementation of the old-style in-process resources and their connection to WebKit.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/browser/renderer_host/pepper/pepper_*_host.* \u003c/font\u003e— Backend (\"host\") implementations of new-style resources in the Content browser process.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/renderer/pepper/pepper_*_host.*\u003c/font\u003e — Backend (\"host\") implementations of new-style resources in Content renderer process\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/renderer/pepper/pepper_plugin_delegate_impl.*\u003c/font\u003e — Delegate interface used to talk to the browser from the WebKit code.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/renderer/render_view.cc\u003c/font\u003e — Allocates the plugins (see \u003cfont face\u003d\"'courier new', monospace\"\u003ecreatePlugin\u003c/font\u003e).\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome/test/ppapi/\u003c/font\u003e — Code to run the tests as part of the Chrome browser tests.\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Issue-tracking\" /\u003eIssue tracking\u003c/h2\u003e\u003cdiv\u003eWe're tracking PPAPI bugs in the Chromium issue tracker to keep things simpler. To file a pepper-related bug, use \u003ci\u003eall\u003c/i\u003e of the following labels:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eArea-Internals\u003c/li\u003e\u003cli\u003eCr-Internals-Plugins-Pepper\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIf the bug relates to a Native Client specific part, additionally use the label:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eNaCl\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eSee the \u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dlabel%3ACr-Internals-Plugins-Pepper\u0026amp;colspec\u003dID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified\u0026amp;cells\u003dtiles\"\u003ecurrent open bugs under the \"Cr-Internals-Plugins-Pepper\" label\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Running-a-plugin-in-Chrome\" /\u003eRunning a plugin in Chrome\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eThere are two modes of operation, \"trusted\" and \"untrusted\" plugins. Untrusted plugins use the \u003ca href\u003d\"http://code.google.com/p/nativeclient/\"\u003eNative Client\u003c/a\u003e to safely run code from the web and is cross-platform. Trusted plugins are loaded directly in either the renderer process or a separate plugin process as platform-specific libraries.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou run a plugin in trusted mode by building a platform-specific library implementing the API. For random manual testing, you can use one of the examples, the graphics 2D \"paint manager\" example is a good one for general hacking (see \u003cfont face\u003d\"courier new, monospace\"\u003eppapi/examples/2d/\u003c/font\u003e). A trusted plugin is instantiated by registering it to handle a MIME type on the command line. Provide the full plugin name (which varies by platform), followed by a semicolon, followed by the MIME type. The MIME type should match the \"type\" attribute of the object tag specified on your page. For the paint manager example plugin on Linux, you would run:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome --register-pepper-plugins\u003d\"/local/src/out/Debug/lib/libppapi_example_paint_manager.so;application/x-ppapi-example-2d\" file:///local/src/ppapi/examples/2d/2d.html\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn this case, \u003cfont face\u003d\"'courier new', monospace\"\u003eapplication/x-ppapi-example-2d\u003c/font\u003e is what is specified in the \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/ppapi/examples/2d/2d.html?revision\u003d144972\u0026amp;view\u003dmarkup\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eexample.html\u003c/font\u003e\u003c/a\u003e page. This can be anything you want, as long as the two types match. Note also that we specify \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--ppapi-out-of-process\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. In-process mode is being deprecated so it's a good idea to use this in general.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOn Linux, you can automatically launch this process in a new GDB instance in a new xterm, which will help you in debugging startup problems. Use this command line switch:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e--ppapi-plugin-launcher\u003d\u003cspan style\u003d\"white-space:pre\"\u003e'xterm -title plugin -e gdb --eval-command\u003drun --args'\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Old-resource-and-proxy-design\" /\u003e\"Old\" resource and proxy design\u003c/h2\u003e\u003cdiv\u003eMost resources are currently implemented using the old proxy design. There are several layers, and each resource is implemented once for in-process and once for out-of-process.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe in-process implementations are in \u003cfont face\u003d\"courier new, monospace\"\u003econtent/renderer/pepper/ppb_*_impl.*\u003c/font\u003e These integrate with the rest of Chrome by using blink or other parts of content/renderer.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe proxy implements interfaces for the out-of-process case. They are implemented in \u003cfont face\u003d\"courier new, monospace\"\u003eppapi/proxy/ppb_*_proxy.*\u003c/font\u003e The proxy has a \u003cfont face\u003d\"courier new, monospace\"\u003eppapi/proxy/dispatcher.h\u003c/font\u003e on each end of the IPC channel. The specialization \u003cfont face\u003d\"courier new, monospace\"\u003ePluginDispatcher\u003c/font\u003e is on the plugin side, and the specialization \u003cfont face\u003d\"courier new, monospace\"\u003eHostDispatcher\u003c/font\u003e is on the renderer side. Each interface has a Proxy object for which there is one per dispatcher, and a resource object that corresponds to the PP_Resource object.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSome proxy objects and implementations share some or all of their code. Shared code can be put into \u003cfont face\u003d\"courier new, monospace\"\u003eppapi/shared_impl/ppb_*_shared.*\u003c/font\u003e to avoid duplication.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eLife cycle of a plugin -\u0026gt; renderer call:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003ePlugin calls PPAPI function.\u003c/li\u003e\u003cli\u003eThunk layer converts this to a C++ call on a resource object.\u003c/li\u003e\u003cli\u003eResource object sends IPC message to renderer via the \u003cfont face\u003d\"courier new, monospace\"\u003ePluginDispatcher\u003c/font\u003e.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eHostDispatcher\u003c/font\u003e receives message and forwards it to the appropriate interface proxy object in the renderer.\u003c/li\u003e\u003cli\u003eInterface proxy converts IPC message back to a PPAPI call and issues it to the in-process implementation.\u003c/li\u003e\u003cli\u003eResource \"impl\" gets call and performs action.\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eUnlike the \"new\" design there is no standard way of communicating with the browser. Some components (TCP/UDP sockets) do this with hand-rolled tracking.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-New-resource-and-proxy-design\" /\u003e\"New\" resource and proxy design\u003c/h2\u003e\u003cdiv\u003eAll additions should use the new proxy design. It is higher performance and involves writing much less code. The new and old designs exist in parallel and we're moving resources over one-by-one.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe resource object is implemented once (in \u003cfont face\u003d\"courier new, monospace\"\u003eppapi/proxy/*_resource.cc\u003c/font\u003e). This resource sends IPC to a \"host\" object in the browser and/or renderer process to do its work. The host object does not speak the Pepper API, it just uses Chrome IPC types. It can be in the renderer process, the browser process, or potentially both or neither (if all functionality is contained in the plugin process). It can also be implemented in the chrome or the content modules.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"text-align:center;display:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/pepper-plugin-implementation/pepper_design.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1347512885999/developers/design-documents/pepper-plugin-implementation/pepper_design.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhere does your host object live?\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/renderer/pepper/\u003c/font\u003e — Probably the most common location. Most resources that interact with blink or other renderer functionality will go here.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome/renderer/pepper/\u003c/font\u003e — Use for Chrome-only interfaces (Flash, PDF, other custom stuff for custom Google plugins).\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/browser/renderer_host/pepper/\u003c/font\u003e — Use instead of or in addition to content/renderer/pepper when your resource needs to talk to the browser process for some reason.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome/browser/renderer_host/pepper/\u003c/font\u003e — Use instead of or in addition to chrome/renderer/pepper when your resource needs to talk to the browser process for some reason.\u003c/li\u003e\u003c/ul\u003eEach of the above directories has a \"host factory\" file in it for creating the hosts for your resource. You'll also have access to the \u003cfont face\u003d\"courier new, monospace\"\u003eBrowserPpapiHost\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e / \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eRendererPpapiHost\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e which will allow you to make calls into the system and get context for your resource.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWe support in-process mode for legacy interfaces needed by certain plugins. New resources do not need to support in-process. For resources that need in-process, we have a \"fake\" IPC channel that allows the \"proxy\" and \"host\" to be in the same process. To wire this up, first get your out-of-process implementation working, then hook up creation through \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/renderer/pepper/pepper_in_process_resource_creation.cc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. Note that this only works for resources implemented in \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003econtent/renderer\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. Other types of hosts are not supported in in-process mode.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eLife cycle of a plugin -\u0026gt; renderer call\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003ePlugin calls PPAPI function.\u003c/li\u003e\u003cli\u003eThunk layer converts this to a C++ call on the proxy resource object.\u003c/li\u003e\u003cli\u003eProxy resource does a \u003cfont face\u003d\"courier new, monospace\"\u003eCallRenderer\u003c/font\u003e with its message. This gets embedded into a \"resource call\" IPC message which encodes the resource ID and instance.\u003c/li\u003e\u003cli\u003eThe \u003cfont face\u003d\"courier new, monospace\"\u003eResourceHost\u003c/font\u003e in the renderer receives the message and finds the corresponding resource host object.\u003c/li\u003e\u003cli\u003eThe resource host decodes the message and performs the operation.\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eNote that creation is a separate step. The resource creates the host in the browser or renderer by calling \u003cfont face\u003d\"courier new, monospace\"\u003eSendCreateToBrowser\u003c/font\u003e or \u003cfont face\u003d\"courier new, monospace\"\u003eSendCreateToRenderer\u003c/font\u003e. This is picked up by the host factory in the directory holding the resource.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-a-new-interface\" /\u003eAdding a new interface\u003c/h3\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003ePlease look at our \u003ca href\u003d\"https://docs.google.com/document/d/1sjR0ZlDFVaxnKYdYCeLShumcaeYYSC_CgTM05gKcfXs/edit#heading\u003dh.y526gzy584nh\"\u003ePepper API Process Doc\u003c/a\u003e before starting to implement a new API.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eTo make the interface definitions (this is the same between the \"new\" and \"old\" proxy designs):\u003c/span\u003e\u003c/b\u003e\u003cbr /\u003e\u003col\u003e\u003cli\u003e\u003cb\u003eCreate the IDL file.\u003c/b\u003e\u003cb style\u003d\"font-weight:normal\"\u003e \u003c/b\u003eMost new interfaces will be dev so would be called \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/api/dev/ppb_foo_dev.idl\u003c/font\u003e.\u003c/li\u003e\u003cli\u003e\u003cb\u003eGenerate the C interface file.\u003c/b\u003e Run the script \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/generators/generator.py\u003c/font\u003e. Make sure to run it from within the generators directory. This should make a corresponding \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/c/dev/ppb_foo_dev.h\u003c/font\u003e file which you should add to your CL.\u003c/li\u003e\u003cli\u003e\u003cb\u003eWrite a C++ wrapper for your interface.\u003c/b\u003e (Some classes may not need C++ wrappers, check with Brett if you're unsure.) The corresponding location would be in \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/cpp/foo_dev.h\u003c/font\u003e. This is pretty easy and you should be able to copy the surrounding classes. Add it to the .gyp file.\u003c/li\u003e\u003cli\u003e\u003cb\u003eAdd your new interface file to the C test list in\u003c/b\u003e \u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/tests/all_c_includes.h\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;border-collapse:collapse\"\u003e. This is how we make sure that everything continues to compile in C (rather than just C++ mode).\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTo hook up your interface\u003c/font\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e (this is the same between the \"new\" and \"old\" proxy designs):\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eWrite a C++ \"API\" for it.\u003c/b\u003e This is in \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/thunk/ppb_foo_api.h\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. This defines the virtual interface that Chrome will use to implement your interface. If your interface is a bunch of functions rather than a new resource, you can just add it on to \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppb_instance_api.h\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. Check with Brett if you're unsure. Add a creation function for your resource to \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eResourceCreationAPI\u003c/font\u003e.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eWrite a thunk for it.\u003c/b\u003e This converts the C PPAPI calls for your interface to C++ calls on the API you made in the previous step. Look at a similar interface to see what it does. Typically the Create function on a resource API would go through the \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eResourceCreationAPI\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e object (add a function there for your new resource type) and the rest of the functions go through to your API. Add the thunk and API to ./ppapi/ppapi_shared.gypi.\u003cbr /\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eRegister the interface with Chrome.\u003c/b\u003e Add it to ppapi/thunk/interfaces_ppb_public_dev.h. Follow the directions in the _stable version of that file. This tells Chrome about your interface name and connects your thunk function to it. This file is included in various places that define implementations of the macros to register the name-\u0026gt;vtable mapping.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eImplement the resource \"proxy\" (this is different from the \"old\" design):\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eCreate the proxy file.\u003c/b\u003e This is called \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eFooResource\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e as opposed to \"old\" design resources which would be \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ePPB_Foo_Proxy\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. \u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eDefine the IPC messages you need.\u003c/b\u003e Add them to \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eppapi/proxy/ppapi_messages.h\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. You'll generally need one for creating your host resource, one for each \"call\" from the proxy to the host, and one for each \"reply\".\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eWrite a unit test in the same directory.\u003c/b\u003e This should just emulate the IPC layer. Be sure to test different edge conditions and make sure that the proper IPC messages are sent in response to plugin calls, and that the correct plugin callbacks are called in response to IPC messages.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eImplement the resource \"host\" (this is different from the \"old\" design):\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eWrite the resource host.\u003c/b\u003e Put the file in one of the four locations discussed above.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eHook up the host creation.\u003c/b\u003e The host factory in the same directory as your resource host should have a switch in it. Be sure to check the permissions if your interface is dev/trusted/etc. to make sure the plugin is allowed to create such resources.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eImplement the IPC message handlers.\u003c/b\u003e You should be able to copy how an existing resource host works to get the calls you expect.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont color\u003d\"#ff0000\" face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eKeep in mind that the plugin is untrusted.\u003c/b\u003e It could be trying to exploit you. Don't trust that it has permission to do anything, and rigorously check all parameters.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Designing-your-interface\" /\u003eDesigning your interface\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eFeatures are implemented as \"interfaces.\" An interface is just a vtable identified by a string name. Most features are implemented as \"resources\" which are generic refcounted project identified by an opaque handle. Your normally have an interface that exposes all the functions your resource supports.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eThe first two functions in a resource's interface should be \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003ePP_Resource Create(PP_Instance, ...)\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e to allow creation of your resource and \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003ePP_Bool IsFoo(PP_Resource)\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e to allow for type checking.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSince most stuff happens out-of-process, these functions should be asynchronous. Asynchronous functions should take a \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003ePP_CompletionCallback\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e argument and return an \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eint32_t\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e (which will normally be \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003ePP_OK_COMPLETIONPENDING\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e for asynchronous completion). It's important that your create function \u003ci\u003enot\u003c/i\u003e be asynchronous because then the caller has no way to cancel the callback (normally you can just delete the object). If you object constuction requires asynchronous completion, have a simple synchronous \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eCreate\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e function and then an asynchronous \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eOpen\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e or \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eInit\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e function which you would call after creation.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMany completion callbacks want to return data. These should be of the form:\u003c/font\u003e\u003cbr /\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  int32_t DoFoo(PP_Resource resource, PP_Var* output_arg, PP_CompletionCallback cb);\u003c/font\u003e\u003cbr /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYour C++ wrapper can then take a \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eCompletionCallbackWithOutput\u0026lt;Var\u0026gt;\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e which has template magic to convert the output argument to a parameter on the callback function.\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Writing-error-logs\" /\u003eWriting error logs\u003c/h2\u003e\u003cdiv\u003eIn a resource implementation, use \u003cfont face\u003d\"'courier new', monospace\"\u003eResource.Log()\u003c/font\u003e to display a message in the console (in the JS inspector) for the page. In other places, use \u003cfont face\u003d\"'courier new', monospace\"\u003ePpapiGlobals::LogWithSource()\u003c/font\u003e.\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eLog messages should have the name of the interface, a dot, and the function name, followed by a colon and the text of the message. The rest of the message should begin with a capital and end with a period as with Chrome comments. So: \u003cfont face\u003d\"'courier new', monospace\"\u003e\"PPB_Foo.Frobulate: The bar is invalid.\"\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNot all errors should have error logs. In fact, most shouldn't. Most functions should have well-defined error conditions that are described in the documentation for that function. In this case, it's unnecessary to log an error because the caller can easily see they got a NOACCESS and look up what that means in the context of your function, for example.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSome things may be tricky or easily called incorrectly, may have no return value, or ambiguous return values. In these cases, it can be useful to add a Log call to tell the programmer how they messed up.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Architecture-of-the-renderer-implementation\" /\u003eArchitecture of the renderer implementation\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eIt may help to open the NPAPI \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/plugin-architecture\"\u003eplugin architecture design doc\u003c/a\u003e in another tab. This section will compare Pepper to the \"in process\" NPAPI implementation. Most of the names are the same between Pepper and NPAPI, except we use the \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::ppapi\u003c/font\u003e namespace and NPAPI uses the \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::npapi\u003c/font\u003e namespace. If you haven't already, you should also understand the \u003ca href\u003d\"http://code.google.com/p/ppapi/wiki/Concepts\"\u003eimportant concepts\u003c/a\u003e of PPAPI.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eTo WebKit, a Pepper plugin is the same as an NPAPI plugin. We implement the \u003cfont face\u003d\"'courier new', monospace\"\u003eWebKit::WebPlugin\u003c/font\u003e interface as \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::ppapi::WebPluginImpl\u003c/font\u003e in \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi_webplugin_impl.cc\u003c/font\u003e. This is our analog of NPAPI's \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::npapi::WebPluginImpl\u003c/font\u003e.\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eThe \u003cfont face\u003d\"'courier new', monospace\"\u003ePluginInstance\u003c/font\u003e object talks to the plugin's \u003cfont face\u003d\"'courier new', monospace\"\u003ePPP_Instance\u003c/font\u003e interface, and receives requests through the browser's \u003cfont face\u003d\"'courier new', monospace\"\u003ePPB_Instance\u003c/font\u003e interface.\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eThe \u003cfont face\u003d\"'courier new', monospace\"\u003ePluginInstance\u003c/font\u003e owns a reference to the \u003cfont face\u003d\"'courier new', monospace\"\u003ePluginModule\u003c/font\u003e which represents the shared library loaded in the renderer. The \u003cfont face\u003d\"'courier new', monospace\"\u003ePluginModule\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e is shared between all instances of that plugin. It\u003c/font\u003e handles loading and unloading of the library, implements the \u003cfont face\u003d\"'courier new', monospace\"\u003ePPB_Core\u003c/font\u003e interface, and also implements the \u003cfont face\u003d\"'courier new', monospace\"\u003eGetInterface\u003c/font\u003e function that the plugin module uses to get all other browser interfaces.\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eIn some cases, the plugin needs to talk \"up\" the browser stack. For example, a certain operation might require that the browser process do something on behalf of the plugin. To support this, there is the \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::ppapi::PluginDelegate\u003c/font\u003e virtual interface.\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eThe \u003cfont face\u003d\"'courier new', monospace\"\u003eRenderView\u003c/font\u003e handles creation of the Pepper plugin in \u003cfont face\u003d\"'courier new', monospace\"\u003eRenderView::createPlugin\u003c/font\u003e. \u003cfont face\u003d\"'courier new', monospace\"\u003eRenderView\u003c/font\u003e has as a member a helper class \u003cfont face\u003d\"'courier new', monospace\"\u003ePepperPluginDelegateImpl\u003c/font\u003e which implements the \u003cfont face\u003d\"'courier new', monospace\"\u003ewebkit::ppapi::PluginDelegate\u003c/font\u003e interface. This implementation is supplied to a plugin when it is created.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debugging-a-plugin\" /\u003eDebugging a plugin\u003c/h2\u003e\u003cdiv\u003eTrusted plugins are loaded directly into the renderer sub-process, rather than a separate plugin process. You can use the standard renderer debugging techniques, including single process mode, for debugging the plugin.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePlugins also run in the renderer sandbox. You will find your plugin code is constrained to the same requirements and limitations as other code in the renderer (can't read and write files or directly access devices).\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Running-the-tests\" /\u003eRunning the tests\u003c/h2\u003e\u003cdiv\u003eThe tests in \u003cfont face\u003d\"'courier new', monospace\"\u003eppapi/tests\u003c/font\u003e are run as part of the Chrome \u003cfont face\u003d\"'courier new', monospace\"\u003ebrowser_tests\u003c/font\u003e. The source code is in \u003cfont face\u003d\"'courier new', monospace\"\u003echrome/test/ppapi\u003c/font\u003e and you can see in that file there are separate GTest tests for each PPAPI test file. To just run this test, you can use:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ebrowser_tests --gtest_filter\u003d\"PPAPITest.*\"\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eOr to run tests out of process:\u003c/span\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ebrowser_tests --gtest_filter\u003d\"OutOfProcessPPAPITest.*\"\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYou can also run the tests manually in Chrome. You first need to build the test plugin, which is the \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi_tests\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e project, and build Chrome (PPAPI doesn't work in test shell). When running Chrome, enable the PPAPI testing interface (it's off by default to prevent production plugins from abusing this API) and register the test plugin as handling the \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eapplication/x-ppapi-tests\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e MIME type:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome --register-pepper-plugins\u003d\"C:\\code\\src\\chrome\\Debug\\ppapi_tests.dll\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#PPAPI Tests##1.2.3\u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e;\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eapplication/x-ppapi-tests\" --enable-pepper-testing\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe library name is platform-specific. On Linux, use \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003elibppapi_tests.so\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e in the output directory. On Mac, use \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eppapi_tests.plugin\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOnce Chrome is running, just load the \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ca href\u003d\"http://code.google.com/p/ppapi/source/browse/trunk/tests/test_case.html\"\u003etest_case.html\u003c/a\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003efile in the browser. Set the \"query\" part of the URL to be the name of the test you want to run, for example to run the ImageData tests, load:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003efile:///C:/code/src/ppapi/tests/test_case.html?ImageData\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYou will see a log of the test cases in the gray square. If the plugin doesn't load, you will see an error message above the gray square indicating that the plugin could not be found. This means that the library name is incorrect or it failed to load for some reason.\u003c/font\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Running-HTTP-tests-manually\" /\u003eRunning HTTP tests manually\u003c/h4\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSome tests like the URLLoader test require that it be run over HTTP. The Chrome browser tests are configured to automatically do this. But for debugging purposes you may want to do this manually. From your \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003esrc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e directory on Linux, do:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eexport PYTHONPATH\u003dthird_party/pyftpdlib/src:third_party/tlslite:\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ethird_party/pywebsocket/src\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003epython net/tools/testserver/testserver.py --port\u003d1337 --data-dir\u003dppapi/tests\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eand on Windows, use:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eset PYTHONPATH\u003dthird_party\\pyftpdlib\\src;third_party\\tlslite;third_party\\pywebsocket\\src\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003epython net\\tools\\testserver\\testserver.py --port\u003d1337 --data-dir\u003dppapi/tests\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThen you should be able to load\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e http://127.0.0.1:1337/files/test_case.html\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e in your browser.\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Running-NaCl-tests-manually\" /\u003eRunning NaCl tests manually\u003c/h4\u003e\u003cdiv\u003eThe NaCl tests also must be run over HTTP, but they are loaded from the build output directory instead of ppapi/tests. So to start the test server for NaCl tests on Linux for a Debug build, do:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eexport PYTHONPATH\u003dthird_party/pyftpdlib/src:third_party/tlslite:\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ethird_party/pywebsocket/src\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003epython net/tools/testserver/testserver.py --port\u003d1337 --data-dir\u003dout/Debug\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eand on Windows, use:\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eset PYTHONPATH\u003dthird_party\\pyftpdlib\\src;third_party\\tlslite;third_party\\pywebsocket\\src\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003epython net\\tools\\testserver\\testserver.py --port\u003d1337 --data-dir\u003dout/Debug\u003c/span\u003e\u003cbr /\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eThe command-line for running NaCl tests is different; you don't need to load the test plugin, but you do need to enable NaCl:\u003c/span\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome --enable-nacl\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e --enable-pepper-testing\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYou must append \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u0026amp;mode\u003dnacl_glibc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\" or \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u0026amp;mode\u003dnacl_newlib\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\" to the URL. E.g.: load \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ehttp://127.0.0.1:1337/files/test_case.html?testcase\u003dURLLoader\u0026amp;mode\u003dnacl_glibc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e in your browser\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e.\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-with-Flash\" /\u003eTesting with Flash\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Running-a-local-build-with-Flash-is-slightly-different.-You-can-usually-run-a-local-build-of-Chromium-with-a-Flash-plugin-that-comes-with-a-recent-Chrome-distribution-for-example-Canary-or-Dev-Channel-using---ppapi-flash-path-and---ppapi-flash-version-gott\" /\u003e\u003cspan style\u003d\"background-color:transparent;font-family:arial,sans-serif;font-size:13px;font-weight:normal\"\u003eRunning a local build with Flash is slightly different. You can usually run a local build of Chromium with a Flash plugin that comes with a recent Chrome distribution (for example, Canary or Dev Channel) using --ppapi-flash-path and --ppapi-flash-version (gotten from the \"Manifest.json\" file that is bundled alongside the Flash plugin in Chrome. For example, on Linux you could type:\u003cbr /\u003e\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-out-Debug-chrome---ppapi-flash-path-opt-google-chrome-unstable-PepperFlash-libpepflashplayer.so---ppapi-flash-version-grep--i-version-opt-google-chrome-unstable-PepperFlash-manifest.json-awk-print-2-awk--F-print-2-\" /\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eout/Debug/chrome --ppapi-flash-path\u003d/opt/google/chrome-unstable/PepperFlash/libpepflashplayer.so --ppapi-flash-version\u003d`grep -i version /opt/google/chrome-unstable/PepperFlash/manifest.json | awk '{print $2}' | awk -F\"\\\"\" '{print $2}'`\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Instead-of-specifying-the-matching-flash-version-you-can-specify-99.99.99.99-like-this:---ppapi-flash-version-99.99.99.99.-This-gives-a-possible-command-line-for-Windows-of-this:\" /\u003e\u003cspan style\u003d\"background-color:transparent;font-family:arial,sans-serif;font-size:13px;font-weight:normal\"\u003eInstead of specifying the matching flash version you can specify 99.99.99.99, like this: \u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e--ppapi-flash-version\u003d99.99.99.99. This gives a possible command line for Windows of this:\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eout\\release_component\\chrome.exe --ppapi-flash-path\u003d\"%localappdata%\\Google\\Chrome SxS\\User Data\\PepperFlash\\25.0.0.119\\pepflashplayer.dll\" --ppapi-flash-version\u003d99.99.99.99\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThere are no specific gn args needed to run flash in a local build - non-official, component, and debug/release builds all work fine.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eMake sure that the bitness (32-bit versus 64-bit) of your local build matches that of the DLL that you specify.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eTo test fullscreen flash, you may use \u003c/span\u003e\u003c/font\u003e\u003ca href\u003d\"https://www.permadi.com/tutorial/flash9FullScreen/index.html\" rel\u003d\"nofollow\" style\u003d\"font-family:Roboto,Noto,sans-serif;font-size:13px;white-space:pre-wrap;background-color:transparent;color:rgb(0,0,204);word-break:break-all\" title\u003d\"\"\u003ehttps://www.permadi.com/tutorial/flash9FullScreen/index.html\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/pepper-plugin-implementation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3050195328525704777"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3050195328525704777"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3050195328525704777"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$pageName":{"$t":"pepper-plugin-implementation"},"sites$revision":{"$t":"85"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/416068964610715649"},"published":{"$t":"2010-07-22T18:39:38.513Z"},"updated":{"$t":"2019-03-05T21:40:08.339Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-05T21:40:06.141Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Translate"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Objective\" /\u003eObjective\u003c/h2\u003eThe great thing about the web is that it lets people from all over the world share information and ideas. Unfortunately that information is sometimes in a language the user does not understand.\u003cbr /\u003eThe goal of the Translate feature is to provide a way for users to translate a page's text when it is not in the same language as the one Chrome is configured with.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003eThe Translate feature works in conjunction with the Google Translate server, which is actually responsible for translating the page.\u003cbr /\u003eHere is the basic scenario of a page translation:\u003cbr /\u003e\u003cul\u003e\u003cli\u003ethe user visits a page in a different language\u003c/li\u003e\u003cli\u003eonce the page has been loaded, the renderer extracts the text from the page and detects which language it's in and sends it to the browser process\u003cbr /\u003e\u003c/li\u003e\u003cli\u003ethe browser compares the page language to the language it is configured with. If they are different it shows an infobar with a button to translate the page\u003c/li\u003e\u003cli\u003eif the user clicks that button, the browser download a script for translating the page from the Google Translate server and sends it to the renderer\u003c/li\u003e\u003cli\u003ethe renderer injects the script in the page and instructs it to translate the page\u003cbr /\u003e\u003c/li\u003e\u003cli\u003ethe render keeps polling the script for when translation is complete or if it has failed, and forward that notification to the browser\u003cbr /\u003e\u003c/li\u003e\u003cli\u003ethe browser displays an infobar to report that the page has been translated or that the translation failed\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-typical-scenario\" /\u003eDetailed typical scenario\u003cbr /\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Page-language-detection\" /\u003ePage language detection\u003c/h3\u003eThe renderer already extracts the text from each loaded page for indexing purpose (so that users can look for pages they visited based on words these pages contain). The language detection piggy-backs on that process. Once the text has been extracted for indexing, a third-party library called CLD (Compact Language Detection) is used to detect the language.\u003cbr /\u003eNote that the language detection is fairly fast but may not always be accurate for certain pages.\u003cbr /\u003eThe page language is then sent along with the page's text to the browser in the ViewHostMsg_PageContents IPC message.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Exception-to-the-translation\" /\u003eException to the translation\u003c/h3\u003eSome pages may not want to be translatable. They might provide their own translation mechanism (for example GMail) or may not be good target for translation (heavy dynamic sites).  To disable translation, they need to include a specific meta tag (name \"google\", content should be \"notranslate\").\u003cbr /\u003eWhether the page should be a candidate for translation is also provided with the ViewHostMsg_PageContents IPC message that is sent by the renderer.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Prompting-the-user-for-translation\" /\u003ePrompting the user for translation\u003c/h3\u003eOnce the ViewHostMsg_PageContents IPC message is received by the browser, the TabContents sends a TAB_LANGUAGE_DETERMINED notifications. The TranslateManager receives that notifications and shows the translate infobar to the user if applicable. There are several transate related infobars (before translation, during translation, after translation, error when translating). All these infobars are controlled by the same delegate TranslateInfobarDelegate, which has a type to determine which type of infobar it is.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Initiating-the-translation\" /\u003eInitiating the translation\u003c/h3\u003e If the user requests the page to be translated, the TranslateManager first needs to download the translate script from the Google server. The download script is cached in the TranslateManager so it can be reused for future translations. We do expire and refetch the script once a day, to ensure that newer versions of that script are downloaded for people with long running browser sessions. The TranslateManager then sends a ViewMsg_TranslatePage IPC message to the renderer to start the translation. The translate script is passed along, with also the original language and language the page should be translated to.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Translating-the-page\" /\u003eTranslating the page\u003c/h3\u003eOn receiving the translate script, the renderer injects it in the page and start the translation (see TranslateHelper::StartTranslation() ).\u003cbr /\u003eFor security reasons, we do not want to the page contents to be able to notify the renderer directly. So we poll the state of the translation regularly until we are notified the translation is complete or has failed (see TranslateHelper::CheckTranslateStatus()). Once we have been notified of such an event, TranslateHelper sends a ViewHostMsg_PageTranslated message to the browser which displays the \"after translate\" infobar to indicate to the user that the translation was performed.\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/translate"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/416068964610715649"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/416068964610715649"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/416068964610715649"}],"author":[{"name":{"$t":"Jay Civelli"},"email":{"$t":"jcivelli@chromium.org"}}],"sites$pageName":{"$t":"translate"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3895141781436329534"},"published":{"$t":"2010-08-13T16:48:25.649Z"},"updated":{"$t":"2019-03-05T09:59:20.433Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-05T09:59:18.404Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Pre-installed Extensions"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003ePre-installing an extension can be done in one of three ways: via Group Policy, via the Registry, or via master_preferences.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003ePre-installing via Group Policy\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eUsing policy to deploy an Extension or Chrome Web App is by far the easiest and scalable method.  This is the recommended method for pushing extensions, as it does not require the CRX file to be on the machine, it must simply be available at a given URL.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo use this method, just set the policy to 'force install' the extension, as documented \u003ca href\u003d\"http://dev.chromium.org/administrators/policy-list-3#ExtensionInstallForcelist\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003ePre-installing via the Registry\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eUsing this method, a special registry key indicates what extensions Google Chrome should load.   This means that the extension .crx file (the file downloaded from the gallery, or the file you package yourself) needs to already be on the machine.  This method is not to be confused with setting policy -- this method sets a completely different registry key and requires the CRX to be on the machine in question.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOnce you have the extension .crx file you'd like to pre-install, follow these steps:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e   1.  \u003c/span\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eCopy the .crx file to a location such as: C:\\path\\to\\your\\extension.crx\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e   2.  Create the registry key: \u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e32-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\Google\\Chrome\\Extensions\\[id of your extension crx]\r\n64-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\\u003cb\u003eWow6432Node\u003c/b\u003e\\Google\\Chrome\\Extensions\\[id of your extension crx]\u003c/pre\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cp\u003e \u003cspan style\u003d\"white-space:pre\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e 3. Create the following registry key values:\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e32-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\Google\\Chrome\\Extensions\\[id of your extension crx]\\path\r\n64-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\\u003cb\u003eWow6432Node\u003c/b\u003e\\Google\\Chrome\\Extensions\\[id of your extension crx]\\path\r\nTYPE: REG_SZ\r\nVALUE: \"C:\\path\\to\\your\\extension.crx\"\r\n\r\n32-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\Google\\Chrome\\Extensions\\[id of your extension crx]\\version\r\n64-bit Windows: HKEY_LOCAL_MACHINE\\SOFTWARE\\\u003cb\u003eWow6432Node\u003c/b\u003e\\Google\\Chrome\\Extensions\\[id of your extension crx]\\version\r\nTYPE: REG_SZ\r\nVALUE: [version of your .crx as specified in the manifest]\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis method requires the CRX is on the machine; this method may not be flexible enough for all deployments.  However, it does mean that users can have an extension pre-installed behind a corporate firewall that restricts downloading of files.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003ePre-installing via master_preferences\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eYou should already be familiar with configuring preferences.  If you are not, read the documentation on \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/configuring-other-preferences\"\u003emaster_preferences and other methods of pre-configuring preferences\u003c/a\u003e.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003ePre-installed extensions are added to the master_preferences file that lives next to chrome.exe. This means that the extension CRX file can live anywhere, and the bits do not need to live on the target user's machine and don't need to be packaged into any installation script.  \u003c/span\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you are not familiar with the master_preferences file or how it works, you will need to \u003c/span\u003e\u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/configuring-other-preferences\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eread this documentation first\u003c/span\u003e\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eThere are some requirements to using this method:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eThis method only works if the user has access to the public extension gallery or another URL where the CRX file is kept; this method may not work if the user is behind a corporate firewall or proxy that restrict access to the gallery.\u003c/li\u003e\r\n\u003cli\u003eThis method generally only works on new installs.  Making it work with an existing install is cumbersome and requires a lot of clean-up steps.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eTo pre-install an extension with just master_preferences changes,\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e   1.  Find the CRX file you want to install.  Download it from the gallery, etc.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e   2.  Open up the CRX with a zip program and find the manifest.json file (it's just a text file).  This contains many values you will need.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e   3.  Set up your master_preferences with values from the manifest.json file.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eHere is an example master_preferences, which pre-installs the Google Reader extension:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e{\r\n \"homepage\" : \"http://dev.chromium.org\",\r\n \"homepage_is_newtabpage\" : true,\r\n \"extensions\": {\r\n \"settings\": {\r\n \"apflmjolhbonpkbkooiamcnenbmbjcbf\": {\r\n \"location\": 1,\r\n \"manifest\": {\r\n \"key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5cK3ybDkh173plsjDXoqUzvsjFRMtbc5+a8HR6dxYBETeXQ7GOR5/xYnsY2R4smo5ly4yUK69iF7rnPNH+X97K7e7JFbuH5W/ZRc8YaIG66oJ9JwKZagSOZasSJPWNz4f1GdaHD1Z4KRucvOYxsaPVdwS2W3nbG6i3oQFaio+JQIDAQAB\",\r\n \"name\": \"Google Reader Notifier (Installing...)\",\r\n \"permissions\": [ \"tabs\", \"http://www.google.com/\" ],\r\n \"update_url\": \"http://clients2.google.com/service/update2/crx\",\r\n \"version\": \"0.0\",\r\n \"manifest_version\": 2\r\n },\r\n \"path\": \"apflmjolhbonpkbkooiamcnenbmbjcbf\\\\0.0\",\r\n \"state\": 1\r\n }\r\n }\r\n }\r\n}\r\n\u003c/pre\u003e\r\n\u003c/span\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eBreaking down the lines in this master_preferences file,\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUnder settings, the first value is the hash of the extension (\"apflmjolhbonpkbkooiamcnenbmbjcbf\"). You get this by packaging up the CRX file, and is also the extension's identifier in the gallery.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"location\" must always be 1.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe \"manifest\" section must contain \"key\", \"name\", \"permissions\", \"update_url\", \"version\", and \"manifest_version\". These can come from the extension's manifest.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe \"key\" value comes from the packaged extension, just like the hash. If you look at an unzipped CRX file, you'll find the \"key\" in manifest.json.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"name\" can be anything, although having a temporary tag (i.e. \"(Installing...)\") will help users understand why an extension is taking an extra bit of time to load.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"permissions\" \u003c/font\u003e\u003c/span\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emust be the same as the permissions in the extension CRX file\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e at \"update_url\", or the user will see lots of warnings and it won't load. So, you can't specify and empty permissions array, and the real extension requires lots of permissions -- that would hide escalating privilege.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"update_url\" is the URL where the CRX lives.  Again, this is in the manifest.json file.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"version\" should always be \"0.0\"\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\"manifest_version\" should be the same as in the extension CRX file manifest.json (current manifest_version 2)\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"path\" should always be the extension's hash followed by \"\\\\0.0\".\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"state\" should always be 1.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf any of these rules are broken, the extension may not load or the user may see a warning.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cstrong\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eImportant:\u003c/span\u003e\u003c/font\u003e\u003c/strong\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e If the extension contains content scripts that need permissions, they must be listed in the master_preferences as well. For example,\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e{\r\n \"extensions\": {\r\n \"settings\": {\r\n \"apflmjolhbonpkbkooiamcnenbmbjcbf\": {\r\n \"location\": 1,\r\n \"manifest\": {\r\n \"content_scripts\": [ {\r\n \"all_frames\": true,\r\n \"js\": [ \"script.js\" ],\r\n \"matches\": [ \"http://*/*\", \"https://*/*\" ],\r\n \"run_at\": \"document_start\"\r\n } ],\r\n \"key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5cK3ybDkh173plsjDXoqUzvsjFRMtbc5+a8HR6dxYBETeXQ7GOR5/xYnsY2R4smo5ly4yUK69iF7rnPNH+X97K7e7JFbuH5W/ZRc8YaIG66oJ9JwKZagSOZasSJPWNz4f1GdaHD1Z4KRucvOYxsaPVdwS2W3nbG6i3oQFaio+JQIDAQAB\",\r\n \"name\": \"Google Reader Notifier (Installing...)\",\r\n ...\r\n\u003c/pre\u003e\r\n\u003c/span\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the extension has content scripts that need permissions / access, and you do not specify it here, the extension will not load!\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eYou can pre-load multiple extensions. Adding an additional extension is as easy as adding another block under \"settings\":\u003c/span\u003e\u003c/div\u003e\r\n\r\n\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e{\r\n \"extensions\": {\r\n \"settings\": {\r\n \"apflmjolhbonpkbkooiamcnenbmbjcbf\": { \u0026lt;-- extension one\r\n \"location\": 1,\r\n \"manifest\": {\r\n ...\r\n }\r\n },\r\n \"oaiwevnmzvoinziufeuibyfnzwevmiiw\": { \u0026lt;-- extension two\r\n \"location\": 1,\r\n \"manifest\": {\r\n ...\r\n },\r\n ...\r\n }\r\n }\r\n}\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf the extension has any permissions that require user approval, you also need to include a granted_permissions section:\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"color:rgb(0,96,0);background-color:rgb(224,234,244);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(169,206,241);border-right-color:rgb(169,206,241);border-bottom-color:rgb(169,206,241);border-left-color:rgb(169,206,241);padding-left:1em;padding-top:0.5em;padding-bottom:0.5em\"\u003e{\r\n \"extensions\": {\r\n \"settings\": {\r\n \"mihcahmgecmbnbcchbopgniflfhgnkff\": {\r\n \"location\": 1,\r\n \"manifest\": {\r\n ...\r\n },\r\n \"granted_permissions\": {\r\n \"api\": [ \"tabs\" ],\r\n \"explicit_host\": [ \"http://*.google.com/*\", \"https://*.google.com/\" ],\r\n \"scriptable_host\": [ \"http://example.com/\" ]\r\n },\r\n ...\r\n },\r\n ...\r\n }\r\n }\r\n}\r\n\u003c/pre\u003e\u003c/span\u003e\r\n\u003cdiv\u003eIf you do not include a granted_permissions section, Chrome immediately disables the extension. The granted_permissions field has the following subfields:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\"api\" contains API permissions in the \"permissions\" key of the manifest\u003c/li\u003e\r\n\u003cli\u003e\"explicit_host\" contains any host permissions in the \"permissions\" key of the manifest\u003c/li\u003e\r\n\u003cli\u003e\"scriptable_host\" should be set to any hosts in the extension's content scripts\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eThe easiest way to generate the granted_permissions field is to install the extension locally and then copy the extension's granted_permissions from the Preferences file of your \u003ca href\u003d\"http://dev.chromium.org/user-experience/user-data-directory\"\u003eChrome profile\u003c/a\u003e.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/pre-installed-extensions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3895141781436329534"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3895141781436329534"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3895141781436329534"}],"author":[{}],"sites$pageName":{"$t":"pre-installed-extensions"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1417709785584952228"},"published":{"$t":"2008-08-28T23:23:46.100Z"},"updated":{"$t":"2019-03-04T18:45:02.367Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-03-04T18:45:00.488Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Omnibox"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \u003cdiv class\u003d\"sites-embed-align-left-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Design-Principles\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDesign Principles\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Reduce-cognitive-overhead\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eReduce cognitive overhead\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Stability-and-predictability\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eStability and predictability\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Input-Types-and-Examples\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eInput Types and Examples\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Single-word\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eSingle word\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-URL-or-URL-Fragment-\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eURL (or URL Fragment)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Multiple-words\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eMultiple words\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Search-Keyword\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003eSearch Keyword\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Tab-to-Search\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eTab to Search\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Result-Types\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eResult Types\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Search-for...\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eSearch for...\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-URL\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003eURL\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Previous-URLs\"\u003e\u003cstrong\u003e5.3 \u003c/strong\u003ePrevious URLs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Nav-Suggest\"\u003e\u003cstrong\u003e5.4 \u003c/strong\u003eNav Suggest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Search-Suggest\"\u003e\u003cstrong\u003e5.5 \u003c/strong\u003eSearch Suggest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-History-Results\"\u003e\u003cstrong\u003e5.6 \u003c/strong\u003eHistory Results\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n \r\n \r\n \r\n \r\n \r\n \u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003e\r\n \r\n Introduction\u003c/h2\u003e\r\n \r\n Most modern browsers are equipped with a toolbar, featuring both a URL and a search field. While straightforward, this UI configuration can lead to some confusion and a general feeling of unnecessary complexity. The purpose of Chromium's omnibox is to merge both location and search fields while offering the user some highly relevant suggestions and / or early results.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThere were two trains of thought on what the omnibox should offer. Some reviewers felt that current browsers currently try to guess what the user is typing and offer suggestions. These reviewers would like some better accelerators and some more satisfying shortcuts, these two approaches are detailed below:\u003cbr /\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv style\u003d\"margin-left:40px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eAccelerate my typing\u003c/span\u003e\u003cbr /\u003e\r\nThe omnibox should focus on augmenting the user's commands - all of the tools it provides should be oriented around making the user's input 'better', and sending them to a destination.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eShow me results\u003c/span\u003e\u003cbr /\u003e\r\nIf some highly likely results exist for the user action, these results should be visible in the omnibox. For example, we could show very probable results which are coming from web search or history.\u003c/div\u003e\r\n\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eChromium focuses on the 'accelerate my typing' system - while showing results was powerful for certain navigational tasks, the designs we tested generally had too much cognitive overhead to be useful in normal situations.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv\u003eAdditional details on the philosophy, architecture and implementation details \u003ca href\u003d\"https://docs.google.com/document/d/1Dk_U-zXiMFynKOYYKrS6VKUXrON_ta2mYnAyHa-Uvc0/edit\"\u003eare available here\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Design-Principles\" /\u003eDesign Principles\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Reduce-cognitive-overhead\" /\u003eReduce cognitive overhead\u003c/h3\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003eAn early motivator of combining the search and address bars was a conviction that, even for users who understood the difference between the two, having to make a choice of where to input text was a small (generally subconscious) cognitive load.  Combining the two does not just serve novice users, it reduces cognitive load for more advanced users.  Similarly, the rest of the omnibox design seeks to minimize cognitive load.\u003cbr /\u003e\u003cbr /\u003eOne example of this is the graphical design of the dropdown.  Items are displayed very simply, with a minimum of iconography, bright colors, font changes, and other eye-catching elements.  This makes the dropdown less distracting for cases where users are simply trying to enter text in the edit field and get where they want to go, at the cost of conveying less information about each item when users are carefully scanning their various options.  We believe that users ignore the dropdown most of the time, and so this tradeoff is the right one.  Even when users look at the dropdown, this design makes it simple to rapidly scan the available choices rather than having to carefully read each one.\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Stability-and-predictability\" /\u003eStability and predictability\u003c/h3\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003eIn a control with as many heuristics as the omnibox, users can easily feel out-of-control.  Accordingly, both the edit field and dropdown seek to be as stable and predictable as possible.  Inline autocomplete is designed to operate synchronously to avoid flickering or race conditions, and triggers on very simple conditions (for most sites, after typing the hostname once) so that its behavior doesn't suddenly change after long usage.  The top-ranked item in the dropdown should not change as more results come in.  The dropdown itself is always open while users edit, and always has a selected entry, so that the action Chromium takes on hitting \u0026lt;enter\u0026gt; can always be predicted.  Asynchronous background queries stop when users begin arrowing through the dropdown so the results don't change as users attempt to select desired items.  A highlight marks the hovered row as users mouse over the dropdown so it will be clear which selection will be used if they click.\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Input-Types-and-Examples\" /\u003eInput Types and Examples\u003c/h2\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003eThe biggest challenge faced by the omnibox is figuring out what the user wants - the various input types are detailed below:\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Single-word\" /\u003eSingle word\u003c/h3\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cdiv\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eExample (Search): \u003c/span\u003echeese\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample (URL):\u003c/span\u003e localhost\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nSingle-word searches are hard for us to distinguish from single-word URLs - previous solutions have relied on synchronous DNS lookups to figure out if a user was typing a single-word URL, but such lookups add an unreasonable overhead to the search experience and don't always lead to an expected result. For example, if you wish to look up what 'localhost' means, but you have a local webserver running, the result can be infuriating.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIn Chromium, we decided that consistency and speed was best, and given that the range of 'single-word inputs meant as searches' dwarfs the number of 'single-word inputs meant as URLs', we default to displaying web search results while doing a background DNS lookup to figure out if a local host exists - if it does, we display a \"Did you mean http://input/\" infobar as show below:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197828630/user-experience/omnibox/cheese_results.png\" style\u003d\"border-width:0px\" /\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIf a user accepts the 'did you mean' suggestion, the auto-complete system will ensure that subsequent entries of the given term will go to that URL.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nA user can override the search-first behavior by making the search term look like a URL fragment - typically adding a slash to the end of the input is the easiest way of accomplishing this (eg. \"cheese/\").\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIf a single-word input is in-progress and matches an URL in the user's autocomplete database, we may autocomplete to that full URL.\u003cbr /\u003e\r\n\u003c/blockquote\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-URL-or-URL-Fragment-\" /\u003eURL (or URL Fragment)\u003c/h3\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/div\u003e\u003c/blockquote\u003e\r\n\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e www.google.com\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e www.blues\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e http://localhost\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e pie/\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nItems that look like URLs will be treated as such. There is a range of logic for determining whether something looks like a URL, as there are cases where multiple-word input can still be intended as a URL (editing of query parameters without using '+' or '%20' instead of spaces, for example).\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Multiple-words\" /\u003eMultiple words\u003c/h3\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e where can I buy meat pies?\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e XKCD meaning\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nMultiple-word input is generally treated as search input, unless the first word matches one of the user's keywords.\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Search-Keyword\" /\u003eSearch Keyword\u003c/h3\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e images.google.com ponies\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold\"\u003eExample:\u003c/span\u003e g fastidious\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIf a user has search keyword, the default action may be to activate that keyword using the terms following the keyword as input. \u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Tab-to-Search\" /\u003eTab to Search\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003eIf a user is partway through typing something that auto-completes to a keyword, we allow the user to press \u003cb\u003eTab\u003c/b\u003e to jump to the end of the auto-completion and begin their keyword search term input. This is powerful when combined with our automatic keyword creation - a user who does a search on amazon.com in the course of their normal browsing will be presented with the option of pressing \u003cb\u003eTab\u003c/b\u003e to do an Amazon search the next time they type something that auto-completes to amazon.com, leading to the ability to type 'ama [tab to complete] pies'. We call this functionality 'tab to search'.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/omnibox/keyword.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\"\u003e\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197828930/user-experience/omnibox/keyword.png\" style\u003d\"border-width:0px\" /\u003e\u003c/a\u003e\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Result-Types\" /\u003eResult Types\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"border:medium none;margin:0pt 0pt 0pt 40px;padding:0px\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/omnibox/omnibox_results.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\"\u003e\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197829099/user-experience/omnibox/omnibox_results.png\" style\u003d\"border-width:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Search-for...\" /\u003eSearch for...\u003c/h3\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eThis searches for the typed query - this will be the topmost and default item if the input looks like a search string.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-URL\" /\u003eURL\u003c/h3\u003e\r\nIf the input (after auto-complete, if applicable) looks like a URL, this will repeat the user's input and be the default, top-most item.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Previous-URLs\" /\u003ePrevious URLs\u003c/h3\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eIf the input matches a previous URL, those URLs will be shown here.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Nav-Suggest\" /\u003eNav Suggest\u003c/h3\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eUses the user's default search provider to suggest URLs based on the user's input.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Search-Suggest\" /\u003eSearch Suggest\u003c/h3\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eUses the user's default search provider to suggest search terms based on the user's input.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-History-Results\" /\u003eHistory Results\u003c/h3\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eShows the number of entries in the user's history that match the given input - selecting this item will take the user to the history results page for their given search term.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/omnibox"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1417709785584952228"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1417709785584952228"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1417709785584952228"}],"author":[{"name":{"$t":"Mike Jeffrey"},"email":{"$t":"mjeffrey@google.com"}}],"sites$pageName":{"$t":"omnibox"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"KXsmYD1fEg..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"},"published":{"$t":"2008-08-31T15:02:10.774Z"},"updated":{"$t":"2019-02-27T07:21:09.052Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-27T07:21:05.091Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Contributing Code"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis document has migrated to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md\u003c/a\u003e.\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/contributing-code"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5524506900990061695"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"}],"author":[{"name":{"$t":"Mike Jeffrey"},"email":{"$t":"mjeffrey@google.com"}}],"sites$pageName":{"$t":"contributing-code"},"sites$revision":{"$t":"164"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/16808239897099422"},"published":{"$t":"2013-12-12T21:43:04.565Z"},"updated":{"$t":"2019-02-26T07:14:24.235Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-26T07:14:21.515Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Rappor (Randomized Aggregatable Privacy Preserving Ordinal Responses)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eRAPPOR reports consist of randomly generated data that is biased based on data collected from the user. Data from many users can be aggregated to learn information about the population, but little or nothing can be concluded about individual users from their reports.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eDescriptions of individual metrics should be found in \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/tools/metrics/rappor/rappor.xml\"\u003etools/metrics/rappor/rappor.xml\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor full technical details of the algorithm, see \u003ca href\u003d\"http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/42852.pdf\"\u003ethe RAPPOR paper\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Algorithm\" /\u003e\u003cspan\u003eAlgorithm\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003eThe first time the RapporService is started, a client will generate and save a random 128-byte secret key, which won't change and is never transmitted to the server.  It will also assign itself to a random cohort.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor each metric we collect, we store a \u003ca href\u003d\"http://en.wikipedia.org/wiki/Bloom_filter\" rel\u003d\"nofollow\"\u003eBloom filter\u003c/a\u003e, represented as an array of m bits.  Each cohort uses a different set of hash functions for the bloom filter. \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eWhen the RapporService is passed a sample for recording, it sets bits in the Bloom filter for that metric.  For example, with the \"Settings.HomePage2\" metric, which is collected only for users who opt-in to UMA, our Bloom filter will be an array of 128 bits, and one or two of those bits will be set based on the eTLD+1 of the user's homepage.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce we have collected samples, and are ready to generate a report, we take the array of bits we've gathered for the metric and introduce two levels of noise by taking the following steps.\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eAdd deterministic noise.\u003c/span\u003e\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eCreate a deterministic psuedo-random function by passing the client's secret key, the metric name, and the bloom filter value into an HMAC_DRBG \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003efunction.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor each bit use this deterministic function to flip two weighted coins.\u003c/span\u003e\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf the first is heads, replace the bit with the result of the second coin.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOtherwise, leave the bit as is.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003cli\u003eAdd fresh random noise.\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eUsing fresh randomness, flip two more coins, with different weights.\u003c/span\u003e\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf the bit is true, report the result of the first coin flip.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eOtherwise, report the result of the second.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eThe cohort that the client that belongs to and the results from the above process are sent to the server.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe large amount of randomness means that we can't draw meaningful conclusions from a small number of reports.  Even if we aggregate many reports from the same user, they include the same pseudo-random noise in all of their reports of the same value, so we are effectively limited to one report for each distinct value.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px\"\u003eIndeed, even with infinite amounts of data on a RAPPOR statistic, there are strict bounds on how much information can be learned, as outlined in more detail at \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#262626\" face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"line-height:16px\"\u003e\u003ca href\u003d\"http://arxiv.org/abs/1407.6981\" rel\u003d\"nofollow\"\u003ehttp://arxiv.org/abs/1407.6981\u003c/a\u003e.  In particular, the data collected from any given user or client contains such significant uncertainty, and guarantees such strong deniability, as to prevent observers from drawing conclusions with any certainty.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e\u003cfont color\u003d\"#262626\" face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"line-height:16px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003e\u003cb\u003eAdding metrics\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003eTo add a new rappor metric, you need to add a bit of code to collect your sample, and add your metric to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/tools/metrics/rappor/rappor.xml\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003etools/metrics/rappor/rappor.xml\u003c/a\u003e.  \u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e Samples should be recorded on the UI thread of the browser process.  \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eFor most use cases, you will want to use one of the helper methods in \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/components/rappor/rappor_utils.h\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003ecomponents/rappor/rappor_utils.h\u003c/a\u003e (formerly \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/chrome/browser/metrics/rappor/sampling.h\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003echrome/browser/metrics/rappor/sampling.h\u003c/a\u003e)\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e e.g.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333330154419px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Courier New;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e#include \"components/rappor/rappor_utils.h\"\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333330154419px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Courier New;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;line-height:1.15;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003erappor::\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:13.8000001907349px;white-space:pre-wrap\"\u003eSampleDomainAndRegistryFromGURL(g_browser_process-\u0026gt;rappor_service(),\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:13.8000001907349px;white-space:pre-wrap\"\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\"Settings.HomePage2\", GURL(homepage_url));\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eIf you need to do something more specific you may need to call RapporService::RecordSample directly, e.g.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"font-size:13.3333330154419px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Courier New;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e#include \"components/rappor/rappor_service.h\"\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003ctable cellpadding\u003d\"0\" cellspacing\u003d\"0\" style\u003d\"font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:normal;padding:5px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003eg_browser_process-\u0026gt;rappor_service()-\u0026gt;RecordSample(\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e \"MyCustomMetric\",\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e rappor::ETLD_PLUS_ONE_RAPPOR_TYPE,\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e my_custom_metric_sample);\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e);\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003eIf you collect multiple samples for the same metric in one reporting interval (currently 30 minutes), a single sample will be randomly selected for generating the randomized report.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003eRemember to add documentation for your metric to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/tools/metrics/rappor/rappor.xml\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003etools/metrics/rappor/rappor.xml\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"font-size:13.3333330154419px\"\u003e\u003ctable cellpadding\u003d\"0\" cellspacing\u003d\"0\" style\u003d\"font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:normal;padding:5px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:12px;white-space:pre\"\u003e\u0026lt;rappor-metric name\u003d\"Settings.HomePage2\" type\u003d\"ETLD_PLUS_ONE\"\u0026gt;\r\n \u0026lt;owner\u0026gt;holte@chromium.org\u0026lt;/owner\u0026gt;\r\n \u0026lt;summary\u0026gt;\r\n The eTLD+1 of the prefs::kHomePage setting. Recorded when a profile is\r\n loaded if the URL is valid and prefs::kHomePageIsNewTabPage is false.\r\n \u0026lt;/summary\u0026gt;\r\n\u0026lt;/rappor-metric\u0026gt;\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Code-overview\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode overview\u003c/span\u003e\u003c/h2\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://codereview.chromium.org/49753002\"\u003eCL/49753002\u003c/a\u003e introduces a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporService\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e object which is instantiated by the browser process object.  The service allows collection of RAPPOR metrics and periodically uploads reports to our servers.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Sample-Collection\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eSample Collection\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eIn order to collect samples, we call \u003ccode\u003eRapporService::RecordSample\u003c/code\u003e to record samples of it. \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"line-height:1.15;font-size:10pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eThe first call to \u003ccode\u003eRecordSample\u003c/code\u003e after the browser starts or a report is generated will instantiate a new \u003ccode\u003eRapporMetric\u003c/code\u003e object to hold the data for that metric. If subsequent calls to \u003ccode\u003eRecordSample\u003c/code\u003e are made for the same metric during the same reporting interval, one sample is randomly selected for generating the report. Calls to\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-size:small;line-height:14.9499998092651px;white-space:pre-wrap;background-color:transparent\"\u003e \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt;line-height:normal;white-space:pre-wrap;background-color:transparent\"\u003eRecordSample\u003c/code\u003e\u003cspan style\u003d\"font-family:Arial;font-size:small;line-height:14.9499998092651px;white-space:pre-wrap;background-color:transparent\"\u003e should take place on the browser UI thread.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003cspan\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently, samples may only be collected in the browser process, but \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporMetric\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003es could be serialized to IPC calls to enable collection from other processes.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003ch4 style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Report-generation-and-uploading\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eReport generation and uploading\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\" style\u003d\"line-height:1.15\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe other function of \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporService\u003c/code\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eis generating and uploading reports of the collected data\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFirst \u003ccode\u003eRapporService::RegisterPrefs()\u003c/code\u003e should be called to register\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eprefs::kRapporSecret\u003c/code\u003e\u003c/span\u003e\u003c/font\u003e and \u003cfont size\u003d\"2\" style\u003d\"line-height:1.15\"\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eprefs::kRapporCohort\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and then \u003ccode\u003eRapporService::Start()\u003c/code\u003e may be called\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e to begin generating reports.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\" style\u003d\"line-height:1.15\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporService\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e generates a report shortly after it is started at fixed time intervals afterwards.  If any new \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporMetrics\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003es \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e have been created\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, randomized data is generated for them by calling \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporMetric\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003e::GetReport()\u003c/code\u003e and recorded into a \u003ccode\u003eRapporReports\u003c/code\u003e\u003c/span\u003e\u003c/font\u003e proto\u003cfont size\u003d\"2\" style\u003d\"line-height:1.15\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eRapporMetric\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is deleted.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ctable cellpadding\u003d\"0\" cellspacing\u003d\"0\" style\u003d\"font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:normal;padding:5px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003emessage RapporReports {\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\" /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // Which cohort these reports belong to. The RAPPOR participants are\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // partioned into cohorts in different ways, to allow better statistics and\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // increased coverage. In particular, the cohort will serve to choose the\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // hash functions used for Bloom-filter-based reports.\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e optional int32 cohort \u003d 2;\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\r\n\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e message Report {\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // The name of the metric, hashed.\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e optional fixed64 name_hash \u003d 1;\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\r\n\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // The sequence of bits produced by random coin flips in\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // RapporMetric::GetReport(). For a complete description of RAPPOR\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // metrics, refer to the design document at:\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e // http://www.chromium.org/developers/design-documents/rappor\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e optional bytes bits \u003d 2;\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e }\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e repeated Report report \u003d 3;\r\n\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"background-color:rgb(229,236,249)\"\u003e\u003ctd /\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"white-space:pre;font-family:monospace;font-size:12px;color:blue\"\u003e\u003ccode\u003e}\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe proto is passed to the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ccode\u003eLogUploader\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.  It stores all of the logs it is passed in a queue, and sends them to the server.  When uploads fail, it retries with exponential backoff.  For now, if chrome exits before the logs are uploaded, they are lost.  We may implement caching unsent logs in prefs similar to UMA in the future.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rappor"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/16808239897099422"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/16808239897099422"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/16808239897099422"}],"author":[{"name":{"$t":"Steven Holte"},"email":{"$t":"holte@chromium.org"}}],"sites$pageName":{"$t":"rappor"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"UCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6335819647196911680"},"published":{"$t":"2013-12-10T17:30:50.527Z"},"updated":{"$t":"2019-02-24T17:23:31.423Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-07T16:57:31.799Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using ClusterFuzz"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb style\u003d\"font-size:x-large\"\u003e\u003ca href\u003d\"https://google.github.io/clusterfuzz/\" rel\u003d\"nofollow\"\u003eClusterFuzz documentation has moved\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5568775710312449219"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/bugs/using-clusterfuzz"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6335819647196911680"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6335819647196911680"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6335819647196911680"}],"author":[{"name":{"$t":"Martin Barbella"},"email":{"$t":"mbarbella@chromium.org"}}],"sites$pageName":{"$t":"using-clusterfuzz"},"sites$revision":{"$t":"29"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3901173157726994613"},"published":{"$t":"2011-06-30T21:24:34.626Z"},"updated":{"$t":"2019-02-21T18:04:53.254Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-21T18:04:51.274Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Release Block Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"background-color:transparent;margin:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:initial;vertical-align:baseline;white-space:pre-wrap\"\u003eSee also \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src.git/+/master/docs/process/release_blockers.md\"\u003ethis more recent document\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent;margin:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:initial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent;margin:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:initial;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat are the intents of ReleaseBlock?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:initial;vertical-align:baseline;white-space:pre-wrap\"\u003eReleaseBlock issues are immediately gating the release of the branch (Dev, Beta, Stable).  These issues require the highest priority of attention from the engineers assigned (since they are directly on the critical path).  They are meant to be used as a tool for program managers to focus engineers to get a Chrome release launched with high standard of quality (e.g. absent critical regressions, stability, build issues, etc...).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:initial;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat aren’t the intents?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003eReleaseBlock issues \u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"color:rgb(0,0,0);font-family:Arial;font-size:11pt;font-style:normal;font-variant:normal;white-space:pre-wrap;text-decoration:initial\"\u003eare not\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003e meant to be a scoping or prioritization tool (we have specific labels and normal processes for each of those, respectively mstone- and pri-).  If an issue isn’t getting sufficient attention, it should be escalated to a TPM and/or the priority adjusted accordingly. Making \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003earbitrary\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003e issues ReleaseBlockers, when mstone and proper prioritization would otherwise suffice, makes it very hard to see the true critical path of our release cycle.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent;margin-top:0px;margin-left:0px;margin-bottom:0px;margin-right:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBest Practices:\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eNominate blockers liberally, it’s better to catch someone’s attention than to ignore an issue.\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThat said, expect TPMs to say no sometimes.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAsk yourself if you would really block a release for this issue, if the answer if no, the next best option is to make sure the priority is set correctly, the issue is assigned, and an mstone label is set.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAll ReleaseBlock bugs should have owners\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIf you have a request for an out of band (i.e. non-releaseblock) merge, add a Merge-Requested flag and the TPM responsible for the branch will take a look.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eSignals of Poor Practices:\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAssigned a P2/P3 issue as a ReleaseBlocker \u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ci\u003e\u003cb\u003eExplanation:\u003c/b\u003e\u003c/i\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:square;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eP2/P3 are generally considered nice to have merges\r\n\u003cbr /\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eSetting a ReleaseBlock label 6 weeks in advance of a branch point.\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003ci\u003eExplanation:\u003c/i\u003e\u003c/b\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:square;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIt suggests that normal processes for prioritization/ scoping aren’t being followed.  In cases where issues are not imminently blocking a release (i.e. 3-6 weeks in advance), such practices dilute the intent of a releaseblock, which literally means, drop what you are doing and work on nothing else.  Such calls may be overly disruptive to engineers, and may not be the correct priority call if the issue in question does not need immediate attention.\r\n\r\n\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eSetting a ReleaseBlock issue w/ out an owner or marking it as Available\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003ci\u003eExplanation:\u003c/i\u003e\u003c/b\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:square;font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIf an issue is really critically urgent it should be assigned right away, we should not wait around for normal triage to determine an owner (i.e. we should not be sitting on these issues).\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6489695432843464000"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/issue-tracking/release-block-guidelines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3901173157726994613"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3901173157726994613"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3901173157726994613"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$pageName":{"$t":"release-block-guidelines"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6176261407605870082"},"published":{"$t":"2014-07-03T13:56:45.189Z"},"updated":{"$t":"2019-02-21T00:18:16.615Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-21T00:18:14.762Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Android WebView tests"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis content has moved into the chromium repository: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/test-instructions.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/test-instructions.md\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/129112596680149388"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/android-tests/android-webview-tests"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6176261407605870082"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6176261407605870082"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6176261407605870082"}],"author":[{}],"sites$pageName":{"$t":"android-webview-tests"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"Wil7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7451393598865006389"},"published":{"$t":"2013-05-23T06:58:35.186Z"},"updated":{"$t":"2019-02-19T19:14:06.097Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-19T19:13:48.087Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Runtime Enabled Features"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-This-content-has-moved-to-the-Chromium-source-tree.\" /\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003eThis content has moved to the Chromium source tree.\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-See-the-Runtime-Enabled-Features-guide-there.\" /\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003eSee the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md\"\u003eRuntime Enabled Features guide\u003c/a\u003e there.\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cp style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/p\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-size:13px;font-weight:normal\" /\u003e\r\n\r\n\u003cdiv /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2023764670965291136"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/runtime-enabled-features"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7451393598865006389"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7451393598865006389"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7451393598865006389"}],"author":[{"name":{"$t":"Alan Cutter"},"email":{"$t":"alancutter@chromium.org"}}],"sites$pageName":{"$t":"runtime-enabled-features"},"sites$revision":{"$t":"53"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2711930369214886241"},"published":{"$t":"2014-08-29T22:18:41.685Z"},"updated":{"$t":"2019-02-14T08:27:15.173Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-14T08:27:13.598Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Keyboard-Controlled Reset Circuit"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTo enable users to securely reset a Chrome device, or enter recovery and developer modes, a hardware circuit is required. This function can be implemented with a Silego chip, or an equivalent combination of parts and logic.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-When-a-user-presses-a-combination-of-the-power-key-and-certain-other-keys-the-hardware-circuit-monitoring-the-keyboard-generates-a-reset-signal-to-the-embedded-controller.-The-embedded-controller-controls-power-to-the-rest-of-the-system-which-is-reset-as-w\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;line-height:15.333332061767578px;white-space:pre-wrap;background-color:transparent\"\u003eWhen a user presses a combination of the power key and certain other keys, the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003ehardware circuit monitoring the keyboard generates a reset signal to the embedded controller. The embedded controller controls power to the rest of the system, which is reset as well. The circuit contains a flip-flop that is can only be cleared by the reset signal. This flip-flop is set by a GPIO signal from the embedded controller that is sent before the embedded controller transitions from its read-only firmware to its rewriteable firmware. The output of the flip-flop goes to a GPIO on the main processor, which can use this signal to verify that the EC has been reset and is still running read-only (and hence trusted) code.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Reset\" /\u003e\u003cspan style\u003d\"font-size:13px;white-space:pre-wrap;font-family:verdana,sans-serif;line-height:1.15;background-color:transparent\"\u003eReset\u003c/span\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-To-reset-the-system-the-user-presses-Power-F3-Power-VolumeUp-on-convertible-devices-without-a-secure-keyboard-connection-.-When-the-embedded-controller-resets-it-progresses-from-read-only-firmware-to-rewritable-firmware-for-operation-in-Normal-Mode.\" /\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;font-size:13px;font-weight:normal;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTo reset the system, the user presses Power+F3 (Power+VolumeUp on convertible devices without a secure keyboard connection). When the embedded controller resets, it progresses from read-only firmware to rewritable firmware for operation in Normal Mode.\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Recovery-mode\" /\u003e\u003cspan style\u003d\"font-weight:bold;white-space:pre-wrap;font-family:verdana,sans-serif;line-height:1.15;font-size:13px;background-color:transparent\"\u003eRecovery mode\u003c/span\u003e\u003c/h3\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont style\u003d\"line-height:1.15;font-size:13px;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eTo enter Recovery Mode, the user holds Power+F3+ESC (\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"line-height:1.15;font-size:13px;white-space:pre-wrap;background-color:transparent\"\u003ePower+VolumeUp+VolumeDown on convertible devices without a secure keyboard connection). \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;font-size:13px;background-color:transparent\"\u003eWhen the embedded controller resets in Recovery Mode, it remains in its read-only firmware and tells the main processor to boot in Recovery Mode.\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Developer-mode\" /\u003e\u003cfont face\u003d\"verdana, sans-serif\" style\u003d\"line-height:1.15;font-size:13px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eDeveloper mode\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont style\u003d\"line-height:1.15;font-size:13px;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eUsers can enter Developer Mode from Recovery Mode, usually by pressing Ctrl+D at the recovery screen. Developer Mode can be accessed \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"line-height:1.15;font-size:13px;white-space:pre-wrap;background-color:transparent\"\u003eif and only if the flip-flop indicates that the embedded controller is still in read-only mode. This requirement ensures that the Recovery Mode firmware on the main processor can trust the keyboard messages from the embedded controller (and thus ensures that the keyboard messages are in fact sent by a physical user who is present at the keyboard—not, for example, from a keyboard that has been hijacked by a remote process).\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Optional-battery-cutoff\" /\u003e\u003cfont face\u003d\"verdana, sans-serif\" style\u003d\"line-height:1.15;font-size:13px;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eOptional b\u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eattery cutoff\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont style\u003d\"line-height:1.15;font-size:13px;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eSystems with non-removable batteries may implement a battery cut-off. The battery can be cut off by removing the power adapter while holding Power+F3 \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"line-height:1.15;font-size:13px;white-space:pre-wrap;background-color:transparent\"\u003e(Power+VolumeUp on convertible devices without a secure keyboard connection) \u003c/span\u003e\u003cspan style\u003d\"line-height:1.15;font-size:13px;white-space:pre-wrap;background-color:transparent\"\u003efor 10 seconds or more. The preferred implementation is with a control wire into the controller/gas-gauge inside the battery pack, but an alternative is to force off FETs in the charger circuit. This requirement allows users under direction from support staff to completely cut off power to the device. It also enables users to recover from situations where the power supply has locked up. For example, an out of specification USB device causing the main power regulator to latch a fault and shutdown until power is cycled.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13px;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/keyboard-controlled-reset-circuit/KbdReset.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1550132772632/chromium-os/chromiumos-design-docs/keyboard-controlled-reset-circuit/KbdReset.png\" style\u003d\"width:100%\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\r\n\u003c/font\u003e\u003cp style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;font-family:Arial;line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:36pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cimg alt\u003d\"KeyboardControlledReset.png.1353360421277.png\" height\u003d\"437px;\" src\u003d\"https://lh5.googleusercontent.com/fmWa009HCo9PNdjbjeK5rpUVqax0sbm4RMc0bZpvQOM1NmhXZN867EuEZOCAWm8FMHGsIEm7ryT9kB1TITIfIvMyV32fxxw4nX9teXVWJUQ08EL5-vpybhQ9_ZMr74c55g\" style\u003d\"border:none\" width\u003d\"661px;\" /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:36pt;background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;line-height:1.15;white-space:pre-wrap;background-color:transparent\"\u003eThis hardware circuit does the following:\u003c/span\u003e\r\n\u003c/font\u003e\u003cul style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;line-height:16.66666603088379px;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhen the Power button is pressed, it checks the keyboard matrix to determine whether F3 or VolumeUp (on convertible devices without a secure keyboard connection) is also pressed. If so, it causes a hard-reset of the embedded controller. This action has the side effect of resetting the entire system.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIt provides an EC_IN_RW indicator for whether the embedded controller code has transitioned from read-only code to rewritable code as part of verified boot. This indicator is set by the embedded controller via the EC_ENTERING_RW GPIO and is reset whenever a hard reset is triggered. EC_IN_RW should go to a PCH/SOC GPIO line that can be read by the main processor. EC_IN_RW is an open drain signal and needs to connect to a pin with an internal pullup or have a pullup on the board.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eEC_RST_L resets the embedded controller (and the rest of the system). This is an open drain signal and should be pulled up to the appropriate power rail.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"line-height:1.15;white-space:pre-wrap;font-size:13px;background-color:transparent\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"line-height:1.15;white-space:pre-wrap;font-size:13px;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003eThe embedded controller boots into read-only (RO) code. It then normally verifies and jumps to rewritable (RW) code. Before jumping to RW code, the RO code must assert the EC_ENTERING_RW GPIO. This will set the flip-flop, so that it asserts the EC_IN_RW signal to the main processor.\u003cbr /\u003e\u003c/span\u003e\u003cfont style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;line-height:16.66666603088379px\"\u003e\u003cspan style\u003d\"line-height:14.949999809265137px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-size:13px;font-weight:normal;white-space:pre-wrap;line-height:1.15;background-color:transparent\"\u003eOnce the flip-flop has been set, it can only be cleared by pressing the Reset key combination. No action by the embedded controller can clear the flip-flop. \u003c/span\u003e\r\n\u003c/font\u003e\u003cdiv\u003e\r\n\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/keyboard-controlled-reset-circuit"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2711930369214886241"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2711930369214886241"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2711930369214886241"}],"author":[{}],"sites$pageName":{"$t":"keyboard-controlled-reset-circuit"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/390023325568324191"},"published":{"$t":"2019-02-14T08:26:12.592Z"},"updated":{"$t":"2019-02-14T08:26:12.632Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-14T08:26:12.592Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"KbdReset.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/390023325568324191"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2711930369214886241"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/keyboard-controlled-reset-circuit/KbdReset.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/390023325568324191"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/390023325568324191"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/390023325568324191"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/390023325568324191"}],"author":[{"name":{"$t":"Mark Hayter"},"email":{"$t":"mdhayter@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1029742586972714429"},"published":{"$t":"2018-11-20T12:42:08.541Z"},"updated":{"$t":"2019-02-08T00:31:50.783Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-08T00:31:49.062Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"flag-ownership"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/flag_ownership.md\"\u003eThis page has moved.\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5524506900990061695"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/contributing-code/flag-ownership"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1029742586972714429"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1029742586972714429"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1029742586972714429"}],"author":[{"name":{"$t":"Elly Fong-Jones"},"email":{"$t":"ellyjones@chromium.org"}}],"sites$pageName":{"$t":"flag-ownership"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},"published":{"$t":"2019-02-06T15:26:37.207Z"},"updated":{"$t":"2019-02-07T19:55:22.620Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-07T19:55:21.153Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome OS + Mainline kernel on kevin (Chromebook Plus)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eAdapted from Tomasz's instructions \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d907715#c7\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Applying-the-downstream-patches\" /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eApplying the downstream patches\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eThere are a few patches you must apply to Chrome OS and the kernel to get things working. The following commands will bootstrap your repo. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cb\u003e1- \u003c/b\u003eCherry pick the CLs from \u003ca href\u003d\"https://chromium-review.googlesource.com/q/hashtag:%2522scarlet-upstream%2522+status:open\" target\u003d\"_blank\"\u003ethis ta\u003c/a\u003eg. For convenience, just run the following commands from your src dir in your chromiumos checkout: \u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003epushd third_party/chromiumos-overlay/ \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003erepo start rockchip_upstream . \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003egit fetch https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay refs/changes/89/1348489/4 \u0026amp;\u0026amp; git cherry-pick FETCH_HEAD \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003egit fetch https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay refs/changes/36/1458536/1 \u0026amp;\u0026amp; git cherry-pick FETCH_HEAD \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    popd\u003cbr /\u003epushd overlays/ \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:10pt\"\u003erepo start rockchip_upstream . \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003egit fetch https://chromium.googlesource.com/chromiumos/overlays/board-overlays refs/changes/11/1351911/1 \u0026amp;\u0026amp; git cherry-pick FETCH_HEAD \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    popd\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003epushd platform/minigbm \u0026amp;\u0026amp; \\\u003cbr /\u003e    \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(0,96,0);font-family:monospace\"\u003erepo start rockchip_upstream . \u0026amp;\u0026amp; \\\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003egit fetch https://chromium.googlesource.com/chromiumos/platform/minigbm refs/changes/52/1347652/4 \u0026amp;\u0026amp; git cherry-pick FETCH_HEAD\u003c/span\u003e \u0026amp;\u0026amp; \\\u003cbr /\u003e    popd\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cb\u003e1a-\u003c/b\u003e If you have an internal checkout, also cherry pick the patch from \u003ca href\u003d\"https://chrome-internal-review.googlesource.com/q/hashtag:%2522scarlet-upstream%2522+status:open\" target\u003d\"_blank\"\u003ethis tag\u003c/a\u003e. Again, for convenience, here is the command:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003epushd private-overlays/baseboard-gru-private/ \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    repo start rockchip_upstream . \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003c/span\u003e\u003cspan\u003e    \u003c/span\u003egit fetch https://chrome-internal.googlesource.com/chromeos/overlays/baseboard-gru-private refs/changes/14/722014/1 \u0026amp;\u0026amp; git cherry-pick FETCH_HEAD \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    popd\u003c/span\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cb\u003e2-\u003c/b\u003e Check out an upstream kernel into the v4.4 kernel directory, and apply the attached patches:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003epushd third_party/kernel/v4.4/ \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    git remote add torvalds \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003egit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    git fetch torvalds \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    git branch -t rockchip_upstream torvalds/master \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    git checkout rockchip_upstream \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0001-FROMLIST-drm-panel-add-Kingdisplay-kd097d04-panel-dr.patch?attredirects\u003d0' | git am) \u0026amp;\u0026amp; \\\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0002-CHROMIUM-drm-Add-drm_master_relax-debugfs-file-non-r.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0003-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_MAP_DUMB-for-rende.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0004-CHROMIUM-drm-Allow-render-node-access-to-KMS-getters.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0005-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_DESTROY_DUMB-for-r.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0006-CHROMIUM-drm-rockchip-Enable-rendernode.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0007-CHROMIUM-drm-rockchip-Add-GEM-ioctls.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e    (curl -L 'https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0008-CHROMIUM-Revert-drm-vgem-create-a-render-node-for-vg.patch?attredirects\u003d0\u0026amp;d\u003d1' | git am) \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cspan\u003e    popd\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eAlternatively, you can use \u003ca href\u003d\"https://gitlab.freedesktop.org/seanpaul/kernel/tree/rockchip_upstream\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ethe following branch\u003c/a\u003e with the patches already applied:\u003c/span\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003epushd third_party/kernel/v4.4/ \u0026amp;\u0026amp; \\\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e \u003cspan\u003e    \u003c/span\u003egit remote add seanpaul_gitlab https://gitlab.freedesktop.org/seanpaul/kernel.git \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003c/code\u003e\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003egit fetch seanpaul_gitlab \u0026amp;\u0026amp; \\\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e \u003cspan\u003e    \u003c/span\u003egit branch -t rockchip_upstream seanpaul_gitlab/rockchip_upstream \u0026amp;\u0026amp; \\\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003epopd\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eIf you use the provided branch, you might want to rebase it on a fresher kernel if it becomes stale [exercise left to the reader].\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Building-the-image\" /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eBuilding the image\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eAll of the pieces are in place to build your image with the upstream kernel! Run the following commands in your chroot to build your image:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Roboto,Noto,sans-serif;font-size:13px;white-space:pre-wrap\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eexport BOARD\u003d\"kevin|scarlet\"\r\n\r\n# Only run once\r\n./setup_board --board\u003d$BOARD\r\n\r\ncros_workon-$BOARD start minigbm chromeos-kernel-4_4\r\n\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eFor scarlet:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13px;white-space:pre-wrap\"\u003eVIDEO_CARDS\u003d\"llvmpipe rockchip\" \u003c/span\u003eUSE\u003d\"llvm llvm_targets_ARM gpu_sandbox_failures_not_fatal -gpu_sandbox_start_early -tpm2 mocktpm $USE\" ./build_packages --board\u003d$BOARD\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eFor kevin:\u003c/span\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13px;white-space:pre-wrap\"\u003eVIDEO_CARDS\u003d\"llvmpipe rockchip\" \u003c/span\u003eUSE\u003d\"llvm llvm_targets_ARM gpu_sandbox_failures_not_fatal -gpu_sandbox_start_early $USE\"\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:10pt\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:10pt\"\u003e./build_packages --board\u003d$BOARD\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBuild a test image:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./build_image --boot_args\u003d\"noinitrd kgdboc\u003dttyS2 slub_debug\u003dFZPUA\" --enable_serial\u003dttyS2 --board\u003d${BOARD} --noenable_rootfs_verification test\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eNow follow the instructions from the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/developer_guide.md#Installing-Chromium-OS-on-your-Device\" target\u003d\"_blank\"\u003eChromium OS Developer Guide\u003c/a\u003e to flash your image to a USB stick and boot it on your device.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eDeploying changes to the kernel is as easy as:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eemerge-${BOARD} chromeos-kernel-4_4\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e./update_kernel.sh --remote \u0026lt;device_ip\u0026gt;\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7399956187366044116"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1761080373240790021"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$pageName":{"$t":"chrome-os-mainline-kernel-on-kevin-chromebook-plus"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4316435725611916912"},"published":{"$t":"2013-12-10T17:31:44.582Z"},"updated":{"$t":"2019-02-07T16:57:31.901Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-07T16:57:29.886Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Developing Fuzzers for ClusterFuzz"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003e\u003ca href\u003d\"https://google.github.io/clusterfuzz/\" rel\u003d\"nofollow\"\u003eClusterFuzz documentation has moved\u003c/a\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5568775710312449219"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/bugs/developing-fuzzers-for-clusterfuzz"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4316435725611916912"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4316435725611916912"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4316435725611916912"}],"author":[{"name":{"$t":"Martin Barbella"},"email":{"$t":"mbarbella@chromium.org"}}],"sites$pageName":{"$t":"developing-fuzzers-for-clusterfuzz"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"KXsmYD1ZEw..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5805824807313488272"},"published":{"$t":"2008-11-12T00:06:54.377Z"},"updated":{"$t":"2019-02-06T18:59:17.708Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T18:59:17.708Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Install depot_tools"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eChromium and Chromium OS use a package of scripts called \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/depottools\"\u003e\u003cb\u003edepot_tools\u003c/b\u003e\u003c/a\u003e to manage checkouts and code reviews.  \u003c/div\u003e\r\n\u003cdiv\u003eThe depot_tools package includes \u003ccode\u003egclient\u003c/code\u003e, \u003ccode\u003egcl\u003c/code\u003e, \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003egit-cl\u003c/code\u003e, \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003erepo\u003c/code\u003e, and others.\u003c/div\u003e\r\n\u003cp style\u003d\"background:hsl(60,100%,94%);border:1px solid hsl(60,100%,74%);padding:5px\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eView the \u003c/span\u003e\u003ca href\u003d\"https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up\" style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cb\u003eupdated depot_tools set-up documentation\u003c/b\u003e in the depot_tools tutorial\u003c/a\u003e.\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal\"\u003e\u003cbr /\u003e\r\nThen continue with the tutorial or \u003ca href\u003d\"https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html\"\u003esee the depot_tools documentation\u003c/a\u003e for usage. These same docs are also available as man pages.\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eSee also \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/depottools\"\u003eHow-To: Using depot_tools\u003c/a\u003e\u003c/p\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/install-depot-tools"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5805824807313488272"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5805824807313488272"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5805824807313488272"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$pageName":{"$t":"install-depot-tools"},"sites$revision":{"$t":"105"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4066935483596842478"},"published":{"$t":"2019-02-06T15:32:09.924Z"},"updated":{"$t":"2019-02-06T15:32:09.955Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:32:09.924Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0008-CHROMIUM-Revert-drm-vgem-create-a-render-node-for-vg.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4066935483596842478"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0008-CHROMIUM-Revert-drm-vgem-create-a-render-node-for-vg.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4066935483596842478"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4066935483596842478"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4066935483596842478"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4066935483596842478"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4409889236592217711"},"published":{"$t":"2019-02-06T15:32:07.000Z"},"updated":{"$t":"2019-02-06T15:32:07.026Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:32:07.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0001-FROMLIST-drm-panel-add-Kingdisplay-kd097d04-panel-dr.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4409889236592217711"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0001-FROMLIST-drm-panel-add-Kingdisplay-kd097d04-panel-dr.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4409889236592217711"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4409889236592217711"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4409889236592217711"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4409889236592217711"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/402469640698184160"},"published":{"$t":"2019-02-06T15:30:40.724Z"},"updated":{"$t":"2019-02-06T15:30:40.760Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:40.724Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0002-CHROMIUM-drm-Add-drm_master_relax-debugfs-file-non-r.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/402469640698184160"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0002-CHROMIUM-drm-Add-drm_master_relax-debugfs-file-non-r.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/402469640698184160"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/402469640698184160"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/402469640698184160"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/402469640698184160"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6922272860550602358"},"published":{"$t":"2019-02-06T15:30:35.131Z"},"updated":{"$t":"2019-02-06T15:30:35.159Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:35.131Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0003-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_MAP_DUMB-for-rende.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6922272860550602358"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0003-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_MAP_DUMB-for-rende.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6922272860550602358"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6922272860550602358"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6922272860550602358"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6922272860550602358"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4423617977013897100"},"published":{"$t":"2019-02-06T15:30:32.614Z"},"updated":{"$t":"2019-02-06T15:30:32.643Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:32.614Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0004-CHROMIUM-drm-Allow-render-node-access-to-KMS-getters.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4423617977013897100"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0004-CHROMIUM-drm-Allow-render-node-access-to-KMS-getters.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4423617977013897100"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4423617977013897100"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4423617977013897100"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4423617977013897100"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6020068051317177976"},"published":{"$t":"2019-02-06T15:30:28.890Z"},"updated":{"$t":"2019-02-06T15:30:28.934Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:28.890Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0005-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_DESTROY_DUMB-for-r.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6020068051317177976"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0005-CHROMIUM-drm-Allow-DRM_IOCTL_MODE_DESTROY_DUMB-for-r.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6020068051317177976"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6020068051317177976"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6020068051317177976"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6020068051317177976"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2745967715381973275"},"published":{"$t":"2019-02-06T15:30:25.902Z"},"updated":{"$t":"2019-02-06T15:30:25.929Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:25.902Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0006-CHROMIUM-drm-rockchip-Enable-rendernode.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2745967715381973275"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0006-CHROMIUM-drm-rockchip-Enable-rendernode.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2745967715381973275"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2745967715381973275"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2745967715381973275"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2745967715381973275"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1132563993698106260"},"published":{"$t":"2019-02-06T15:30:23.404Z"},"updated":{"$t":"2019-02-06T15:30:23.445Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-06T15:30:23.404Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0007-CHROMIUM-drm-rockchip-Add-GEM-ioctls.patch"},"summary":{},"content":{"type":"text/x-diff","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1132563993698106260"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1761080373240790021"},{"rel":"alternate","type":"text/x-diff","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/mainline-kernel-on-kevin-chromebook-plus/chrome-os-mainline-kernel-on-kevin-chromebook-plus/0007-CHROMIUM-drm-rockchip-Add-GEM-ioctls.patch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1132563993698106260"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132563993698106260"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132563993698106260"},{"rel":"edit-media","type":"text/x-diff","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1132563993698106260"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2744141007410642158"},"published":{"$t":"2019-02-05T19:26:21.024Z"},"updated":{"$t":"2019-02-05T19:26:53.190Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-05T19:26:51.815Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"2018 OKRs"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-2018-Q4\" /\u003e2018 Q4\u003c/h2\u003e\u003ch2 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Eventing-Sub-team-\" /\u003e\u003cb style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:large\"\u003eEventing Sub-team \u003c/b\u003e\u003c/h2\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.67\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.67\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eWorker input event routing \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip predicted points API \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip User Activation v2 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eResolve all User Activation v2 test regressions by M72 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip pointerrawmove \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eHarden User Activation code against untrusted renderer (crbug.com/848778) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-0.58\" /\u003eProduct Excellence \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.58\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eSynthetic pointer events automation  \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eBe responsive to our users \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix impactful bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix prominent input interaction bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.55\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImproved key inputs on Windows \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.30\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eGPU Benchmarking enhancements \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePointerLock \u0026amp; MovementX/Y \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUnified Pointer Capture in Blink \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Code-Health-1.00\" /\u003eCode Health \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003e--use-zoom-for-dsf in Android  \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eLand 8 code-cleanup CLs. \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-Scrolling-Sub-team-\" /\u003e\u003cfont size\u003d\"4\"\u003eScrolling Sub-team\u003c/font\u003e\u003cspan style\u003d\"font-family:sans;font-size:13.3333px;background-color:transparent;font-weight:normal\"\u003e \u003c/span\u003e\u003c/h2\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.70\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eEnable pull to refresh on the web \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip Implicit RootScroller \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improve-Performance-0.60\" /\u003eImprove Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eHold the line on Input Performance  \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePassive root wheel event listener intervention (crbug.com/125223) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePrediction framework experiments for scrolling \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eImprove scrolling smoothness in high-latency mode \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eRemove timer to update hover state \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.30\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Code-Health-0.50\" /\u003eCode Health \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eShip Blink-Gen-Property-Trees \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eThreaded and OOPIF scroll tests coverage \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eDe-flake Scrolling Tests \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eScroll Unification \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix scroll restoration issue on youtube \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-2018-Q3-\" /\u003e2018 Q3 \u003c/h2\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Eventing-Sub-team-1\" /\u003e\u003cb style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:large\"\u003eEventing Sub-team \u003c/b\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.58\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.58\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eFix remaining User Activation v2 test failures \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip User Activation v2 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eWorker input event routing \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eHarden User Activation code against untrusted renderer \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip predicted points API \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMove Pointerlock spec v2 to recommendation \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-0.70\" /\u003eProduct Excellence \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eBe responsive to our users \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix impactful bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMove movementXY calculation to Blink \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eDirect manipulation stylus across all platforms \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eYeti team support \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePrediction framework experiments \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eNoisy mouseleave events on Windows (crbug.com/798535) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eAutomate pointerevent tests in wpt.fyi \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eEnhance GPU benchmarking API surface \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMake GPU synthetic pointer action calls consistent with test driver calls \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Code-Health-0.72\" /\u003eCode Health \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.72\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eEnabling --use-zoom-for-dsf in Android \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.90\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUse TSF instead of IMM32 on the latest Windows edition \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eCleanup User Activation v2 interface at Web layer (crbug.com/803203) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eSwitch |WebInputEvent::Modifiers| to an enum class \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:400;font-size:13.3333px\" /\u003e\u003c/h2\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-Scrolling-Sub-team-1\" /\u003e\u003cfont size\u003d\"4\"\u003eScrolling Sub-team\u003c/font\u003e\u003cspan style\u003d\"font-family:sans;font-size:13.3333px;background-color:transparent;font-weight:normal\"\u003e \u003c/span\u003e\u003c/h2\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improve-Performance-0.78\" /\u003eImprove Performance \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.78\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eHold the line on Input Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMake document-level wheel listeners passive by default (crbug.com/626196) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eAsync touchpad pinch zoom (crbug.com/565980) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.90\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eKeyboard threaded scrolling (crbug.com/125223) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMake new chrome metric dashboard \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUKM in-depth analysis \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.80\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003eShip Implicit RootScroller \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improve-Code-Health-0.69\" /\u003eImprove Code Health \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.69\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eBlink Generated Property Trees \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.90\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eCreate concrete plan for scroll unification \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.30\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eDrive down layout test flakiness \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-0.53\" /\u003eProduct Excellence \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.53\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eFix bugs related to “scrolling does not work” \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix bugs related to fling and autoscroll fling \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix bugs related to scroll restoration \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-2018-Q2-\" /\u003e2018 Q2 \u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cb style\u003d\"font-size:large\"\u003eEventing Sub-team \u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\" /\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-blink-eco-standards-0.53\" /\u003eAdd Richness to Web Platform (#blink-eco-standards)\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal;color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.53\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eResample input events on main thread and compositor \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUser Activation v2 test failures \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.75\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUser Activation v2 core implementation \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.45\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eBrowser-side triggering of User Activation \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePredicted Points \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eResume prototyping Worker input event routing (#blink-prim-workers) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePointerLock v2 (#blink-eco-wpt) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-blink-pe-0.71\" /\u003eProduct Excellence (#blink-pe) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.71\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eBe responsive to our users (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix 10 regression bugs (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix 8 bugs with \u0026gt;10 stars (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.90\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMove movementXY calculation to Blink (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eRational gesture token handling in Blink (crbug.com/789643) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eAutomate pointerevent tests in wpt.fyi (#blink-eco-wpt) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Code-Health-blink-pe-code-health-0.57\" /\u003eCode Health (#blink-pe-code-health) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.57\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eEnabling --use-zoom-for-dsf in Android \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eCleanup User Activation v2 interface at Web layer (crbug.com/803203) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix WebFrameClient vs WebRemoteFrameClient naming problem (crbug.com/846405) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUse WebPointerEvent instead of WebMouseEvent Blink (#blink-pe-oopif) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.10\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2 style\u003d\"font-family:Times\"\u003e\u003ca name\u003d\"TOC-Scrolling-Sub-team-2\" /\u003e\u003cfont size\u003d\"4\"\u003eScrolling Sub-team\u003c/font\u003e\u003cspan style\u003d\"font-family:sans;font-size:13.3333px;background-color:transparent;font-weight:normal\"\u003e \u003c/span\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\" /\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Code-Health-blink-pe-code-health-0.70\" /\u003eCode Health (#blink-pe-code-health)\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal;color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eFlings generated in the browser process \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.90\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e[SPv2] Implement scrollbars for SPv2 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e[SPv2] Implement ScrollTree/Layer construction in PaintArtifactCompositor \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e[SPv2] Implement visual viewport for SPv2 \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Performance-blink-opti-scheduling-0.81\" /\u003ePerformance (#blink-opti-scheduling) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.81\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eImprove understanding of real-world scrolling performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eHold the line on Input Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePublish Integrated UMA/UKM dashboard \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-blink-pe-0.58\" /\u003eProduct Excellence (#blink-pe) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.58\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv\u003eWindow Touchpad \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImplicit root scroller (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImprove Wheel Scrolling Code (#blink-pe-bugs) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.40\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImprove ChromeOS Scrollbar Experience \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-2018-Q1-\" /\u003e2018 Q1 \u003c/h2\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:large\"\u003eEventing Sub-team\u003c/b\u003e\u003c/div\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improve-Smoothness-and-Predictability-of-Input-Events-0.33\" /\u003eImprove Smoothness and Predictability of Input Events \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.33\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:sans\"\u003e\u003ca name\u003d\"TOC-Resampling-input-events-at-rAF-P1-0.50Predictive-Points-P2-0.00\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eResampling input events at rAF \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePredictive Points \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.57\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.57\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:sans\"\u003e\u003ca name\u003d\"TOC-User-Activation-v2-Simple-User-Activation-P1-0.70Ship-InputMode-P1-1.00PointerEvent-spec---Close-out-V2-start-on-V3-P1-0.70Continue-prototype-for-Worker-input-event-routing-P2-0.00Spec-for-input-for-Workers-P2-0.00Improve-Android-Drag-Drop-crbug.com-156390\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eUser Activation v2 (Simple User Activation) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip InputMode \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003ePointerEvent spec - Close out V2, start on V3 \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eContinue prototype for Worker input event routing \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eSpec for input for Workers \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImprove Android Drag \u0026amp; Drop (crbug.com/156390) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eSpec and Ship InputModeAction \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eClarify screenX/Y and movementX/Y definitions \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Performance-0.82\" /\u003ePerformance \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.82\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:sans\"\u003e\u003ca name\u003d\"TOC-Hold-the-line-on-Input-Performance-P1-0.70UKM-dashboard-P1-1.00Clean-up-input-metrics-P2-0.70\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eHold the line on Input Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eUKM dashboard \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eClean up input metrics \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.70\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-0.75\" /\u003eProduct Excellence \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.75\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:sans\"\u003e\u003ca name\u003d\"TOC-Be-responsive-to-our-users-P1-1.00Touch-Adjustment-crbug.com-625198-P1-0.80Fix-8-regressions-bugs-P2-1.00Fix-6-bugs-with-10-stars-P2-1.00Interoperable-mouse-user-gestures-crbug.com-769796-P2-0.00Rational-gesture-token-handling-in-Blink-crbug.com-789643-P3-\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eBe responsive to our users \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eTouch Adjustment (crbug.com/625198) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix 8 regressions bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix 6 bugs with \u0026gt;10 stars \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eInteroperable mouse user gestures (crbug.com/769796) \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eRational gesture token handling in Blink (crbug.com/789643) \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch2 style\u003d\"font-family:sans\"\u003e\u003ca name\u003d\"TOC-Scrolling-Sub-team-3\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"4\"\u003eScrolling Sub-team\u003c/font\u003e\u003c/span\u003e \u003c/h2\u003e\u003cdiv\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Great-Windows-10-Experience-0.74\" /\u003eGreat Windows 10 Experience \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.74\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Windows-10-Precision-Touchpad-basic-support-P1-0.80Windows-10-Precision-Touchpad-support-gesture-based-navigation-P3-0.50\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eWindows 10 Precision Touchpad basic support \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eWindows 10 Precision Touchpad support gesture based navigation \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.50\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Product-Excellence-0.57\" /\u003eProduct Excellence \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.57\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Fix-impactful-bugs-P2-0.71-Stretch-Subpixel-precision-scrolling-on-main-thread-P4-0.00\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eFix impactful bugs \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.71\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e[Stretch] Subpixel precision scrolling on main thread \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improved-Code-Health-0.71\" /\u003eImproved Code Health \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.71\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Flings-generated-in-the-browser-process-P1-0.60Frame-and-Element-Scrolling-Unified-P1-1.00Keyboard-scrolls-using-gesture-events-P3-0.00\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eFlings generated in the browser process \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.60\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFrame and Element Scrolling Unified \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e1.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eKeyboard scrolls using gesture events \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Improve-Viewport-Interoperability-0.07\" /\u003eImprove Viewport Interoperability \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.07\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Describe-visual-layout-viewport-in-an-official-spec-P2-0.00Settle-on-an-interoperable-and-compatible-way-to-size-the-layout-viewport-P3-0.00Fix-interop-issues-related-to-how-pages-load-initially-P3-0.20\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eDescribe visual/layout viewport in an official spec \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP2\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eSettle on an interoperable and compatible way to size the layout viewport \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eFix interop issues related to how pages load initially \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP3\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Add-Richness-to-Web-Platform-0.21\" /\u003eAdd Richness to Web Platform \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.21\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Web-Apps-can-compose-in-views-P1-0.20Ship-Scroll-Customization-Origin-Trial-P4-0.30\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eWeb Apps can compose in views \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.20\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eShip Scroll Customization Origin Trial \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.30\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-family:Times\"\u003e\u003ca name\u003d\"TOC-Performance-0.71\" /\u003ePerformance \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.71\u003c/span\u003e\u003c/h3\u003e\u003ch3 style\u003d\"margin-bottom:0px\"\u003e\u003ca name\u003d\"TOC-Improve-Wheel-Scrolling-Performance-P1-0.80Improve-understanding-of-real-world-wheel-scrolling-performance.-P4-0.00\" /\u003e\u003cdiv style\u003d\"font-family:Times;font-size:medium;font-weight:400\"\u003e\u003cdiv\u003eImprove Wheel Scrolling Performance \u003cspan style\u003d\"color:rgb(238,170,68);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP1\u003c/span\u003e \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.80\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eImprove understanding of real-world wheel scrolling performance. \u003cspan style\u003d\"color:rgb(44,132,44);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003eP4\u003c/span\u003e \u003cspan style\u003d\"color:rgb(214,18,18);display:inline-block;font-weight:bold;padding:0.3em;height:1.2em;margin-left:1em\"\u003e0.00\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7561957394737716009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/input-dev/input-objectives/2018-okrs"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2744141007410642158"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2744141007410642158"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2744141007410642158"}],"author":[{"name":{"$t":"Navid Zolghadr"},"email":{"$t":"nzolghadr@chromium.org"}}],"sites$pageName":{"$t":"2018-okrs"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/922611123451119087"},"published":{"$t":"2015-03-10T02:44:04.421Z"},"updated":{"$t":"2019-02-05T17:37:55.684Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-02-05T17:37:53.977Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Style Team"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"margin:0;padding:0;max-width:100ex;text-align:justify\"\u003e\r\n\r\n\u003cdiv style\u003d\"border:1px solid red;background-color:#ff000036;padding:1ex;margin:0 5ex 3ex 5ex;text-align:center\"\u003e\r\n The style team has been subsumed into the new \u003ca href\u003d\"//chromium.org/teams/rendering\"\u003erendering core\u003c/a\u003e team. Please see the rendering core page for details about ongoing style work.\r\n \u003cbr /\u003e\r\n\u003cbr /\u003e\r\n This page is preserved for posterity and will no longer be updated.\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cfont size\u003d\"3\"\u003ePrimary contacts: meade@chromium.org, suzyh@chromium.org\u003c/font\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Team-Charter\" /\u003eTeam Charter\u003c/h2\u003e\r\n\u003cfont size\u003d\"3\"\u003eThe Style team is a group of engineers, working at Google (Sydney and Tokyo), Opera (Oslo) and Samsung. We are tasked with improving the style engine in Blink. Our responsibility is to maintain and improve style resolution and application (core/css/resolver, core/style), as well as the other parts of CSS (core/css).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe Style Team triages bugs with the components Blink\u0026gt;CSS.\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-2017-Goals\" /\u003e2017 Goals\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eExplore and improve performance predictability\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eRefactor style engine to be more feature oriented\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eShip CSS Typed OM\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont size\u003d\"3\"\u003eImprove interoperability of Web Animations with Mozilla\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Eternal-goals\" /\u003eEternal goals\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eMaintain ‘code health’ by improving and optimizing style components (CH).\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eMaintain ‘feature health’ (FH).\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eInterface with the rendering steering team to help decide whether to either accept and implement, or reject proposed CSS features.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eTriage CSS issues as they arise (and eliminate the \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dCr%3DBlink-CSS+\u0026amp;colspec\u003dID+Pri+M+Week+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified\u0026amp;x\u003dm\u0026amp;y\u003dreleaseblock\u0026amp;cells\u003dtiles\" style\u003d\"background-color:transparent\"\u003ebacklog\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e).\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eMaintain existing features as necessary.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eImprove knowledge of feature usage and deprecate rare and expensive feature.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cfont size\u003d\"4\"\u003e\u003cb\u003eTeam members\u003c/b\u003e\u003c/font\u003e\r\n\u003cdiv\u003emeade@chromium.org, suzyh@chromium.org (TLs and OWNERs)\u003cbr /\u003e\r\nalancutter@chromium.org (OWNER)\u003c/div\u003e\r\n\u003cdiv\u003ebugsnash@chromium.org, shend@chromium.org, nainar@chromium.org, jiameng@chromium.org, ericwilligers@chromium.org, rjwright@chromium.org\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eLinks\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003ca href\u003d\"http://blink.style/docs\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eDocs\u003c/a\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1Zk3y699NTmH96qEDvofiUHbTckHJbkT8t3vY6ker3z0/edit?ts\u003d590a6e7b#\" target\u003d\"_blank\"\u003eCL best practices\u003c/a\u003e\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eLast updated: May 2017\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/style-team"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/922611123451119087"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/922611123451119087"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/922611123451119087"}],"author":[{"name":{"$t":"Mike Lawther"},"email":{"$t":"mikelawther@chromium.org"}}],"sites$pageName":{"$t":"style-team"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"Xil7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1273561035301015986"},"published":{"$t":"2009-10-27T15:05:38.405Z"},"updated":{"$t":"2019-01-31T15:52:30.270Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-31T15:52:27.338Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GLOSSARY"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"5\"\u003eMoved to \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/glossary.md\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/glossary.md\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/glossary"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1273561035301015986"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273561035301015986"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273561035301015986"}],"author":[{"name":{"$t":"Anantha Keesara"},"email":{"$t":"anantha@chromium.org"}}],"sites$pageName":{"$t":"glossary"},"sites$revision":{"$t":"47"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6793988314446735951"},"published":{"$t":"2018-04-27T13:54:16.936Z"},"updated":{"$t":"2019-01-28T22:08:31.581Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-28T22:08:29.209Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"ANGLE Standalone Testing Infrastructure (obsolete)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"trebuchet ms, sans-serif\" size\u003d\"3\"\u003eThis page is now moved to \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"trebuchet ms, sans-serif\" size\u003d\"3\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/angle/angle/+/master/infra/README.md\"\u003ehttps://chromium.googlesource.com/angle/angle/+/master/infra/README.md\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/angle-infra"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6793988314446735951"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6793988314446735951"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6793988314446735951"}],"author":[{"name":{"$t":"Jamie Madill"},"email":{"$t":"jmadill@chromium.org"}}],"sites$pageName":{"$t":"angle-infra"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4318721600122908448"},"published":{"$t":"2016-05-19T18:18:29.624Z"},"updated":{"$t":"2019-01-28T22:07:55.974Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-28T22:07:54.348Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"ANGLE Wrangling (obsolete)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-This-page-is-now-moved-to-https:-chromium.googlesource.com-angle-angle-master-infra-ANGLEWrangling.md\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-weight:400\"\u003eThis page is now moved to \u003ca href\u003d\"https://chromium.googlesource.com/angle/angle/+/master/infra/ANGLEWrangling.md\"\u003ehttps://chromium.googlesource.com/angle/angle/+/master/infra/ANGLEWrangling.md\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\r\n\r\n\r\n\r\n\r\n\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/angle-wrangling"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4318721600122908448"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5645760938144320383/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4318721600122908448"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4318721600122908448"}],"author":[{"name":{"$t":"Jamie Madill"},"email":{"$t":"jmadill@chromium.org"}}],"sites$pageName":{"$t":"angle-wrangling"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5800715751550392352"},"published":{"$t":"2019-01-24T17:52:26.914Z"},"updated":{"$t":"2019-01-25T20:42:25.320Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-25T20:42:23.207Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Paint Worklet"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003ePaint Worklet, also known as the \u003ca href\u003d\"https://developers.google.com/web/updates/2018/01/paintapi\"\u003eCSS Paint API\u003c/a\u003e, is an effort to enable web developers deeper control of how elements on their page are painted. More details can be found in the \u003ca href\u003d\"https://www.w3.org/TR/css-paint-api-1/\" rel\u003d\"nofollow\"\u003espec\u003c/a\u003e, but in short the API allows developers to specify a custom JavaScript function for any CSS attribute that can take a CSS \u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/CSS/image\" rel\u003d\"nofollow\"\u003e\u0026lt;image\u0026gt;\u003c/a\u003e type. When the particular part needs to be painted, the JavaScript function is called with a \u003ca href\u003d\"https://www.w3.org/TR/css-paint-api-1/#paintrenderingcontext2d\" rel\u003d\"nofollow\"\u003ePaintRenderingContext2D\u003c/a\u003e that can be drawn into:\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cpre style\u003d\"font-family:Menlo,Consolas,DejaVu Sans Mono,Monaco,monospace;font-size:0.9em;margin-top:0.5em;margin-bottom:0.5em;overflow:auto;padding:1em;border-radius:0px;background:rgb(245,242,240)\"\u003epaint\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e(\u003c/span\u003ectx\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e,\u003c/span\u003e size\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e)\u003c/span\u003e \u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e{\u003c/span\u003e\r\n ctx\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e.\u003c/span\u003efillStyle \u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e\u003d\u003c/span\u003e \u003cspan style\u003d\"color:rgb(166,127,89)\"\u003e'green'\u003c/span\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e;\u003c/span\u003e\r\n ctx\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e.\u003c/span\u003efillRect\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e(\u003c/span\u003e\u003cspan\u003e0\u003c/span\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e,\u003c/span\u003e \u003cspan\u003e0\u003c/span\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e,\u003c/span\u003e size\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e.\u003c/span\u003ewidth\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e,\u003c/span\u003e size\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e.\u003c/span\u003eheight\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e);\u003c/span\u003e\r\n\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis functionality first shipped in \u003ca href\u003d\"https://developers.google.com/web/updates/2018/03/nic65\"\u003eChrome M65\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eOff-Thread Paint Worklet\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eOff-Thread Paint Worklet (\u003ca href\u003d\"https://docs.google.com/document/d/1USTH2Vd4D2tALsvZvy4B2aWotKWjkCYP5m0g7b90RAU/edit?ts\u003d5bb772e1#heading\u003dh.2zu1g67jbavu\"\u003edesign doc\u003c/a\u003e) is an ongoing effort (as of 2019/01) to run the developer-provided \u003cfont face\u003d\"courier new, monospace\"\u003epaint\u003c/font\u003e functions on a different thread than the main rendering loop, and asynchronously from the standard document lifecycle. The goal is performance isolation, to allow smooth animation of Paint Worklet-painted elements even when the main thread is busy. This is considered an architectural improvement project and should not be visible to web developers (other than in improved performance of pages that use Paint Worklets).\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4975786110605006351"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/animations/paint-worklet"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5800715751550392352"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5800715751550392352"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5800715751550392352"}],"author":[{"name":{"$t":"Stephen McGruer"},"email":{"$t":"smcgruer@chromium.org"}}],"sites$pageName":{"$t":"paint-worklet"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},"published":{"$t":"2017-04-20T16:33:02.290Z"},"updated":{"$t":"2019-01-22T14:23:50.001Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2017-04-20T19:26:25.483Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Teams"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cimg src\u003d\"http://www.google.com/chart?chc\u003dsites\u0026amp;cht\u003dd\u0026amp;chdp\u003dsites\u0026amp;chl\u003d%5B%5BPage+listing'%3D20'f%5Cv'a%5C%3D0'10'%3D499'0'dim'%5Cbox1'b%5CF6F6F6'fC%5CF6F6F6'eC%5C0'sk'%5C%5B%22Subpage+Listing%22'%5D'a%5CV%5C%3D12'f%5C%5DV%5Cta%5C%3D10'%3D0'%3D500'%3D297'dim'%5C%3D10'%3D10'%3D500'%3D297'vdim'%5Cbox1'b%5Cva%5CF6F6F6'fC%5CC8C8C8'eC%5C'a%5C%5Do%5CLauto'f%5C\u0026amp;sig\u003dlxEPbO98PQKCTIgDHMqrwU0hJD8\" data-type\u003d\"subpages\" data-props\u003d\"align:left;borderTitle:Subpage Listing;displayAs:TOC;maxDepth:1;rootPage:THIS_PAGE;\" width\u003d\"500\" height\u003d\"300\" style\u003d\"display:block;text-align:left;margin-right:auto;\" /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5333416033998729085"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$pageName":{"$t":"teams"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"Wil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1864792937204391037"},"published":{"$t":"2017-11-30T23:06:00.274Z"},"updated":{"$t":"2019-01-18T23:42:50.064Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-18T23:42:48.014Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"TLS 1.3"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eChrome enabled TLS 1.3 in Chrome 70. However, due to bugs in some man-in-the-middle proxies, anti-downgrade enforcement was not enabled. The problematic proxies in question are duplicating a value in the TLS handshake from the origin server rather than randomly generating it themselves. Firstly, this means that they're implementing a slightly different protocol than TLS on their LAN side, the security properties of which are not clear. Secondly, it means that these proxies appear to TLS 1.3-enabled clients to be signaling that a downgrade attack is \u003c/span\u003eoccurring because they're taking TLS 1.3-based values from the origin server and using them in a lower-version TLS handshake on the LAN side.\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIn Chrome 72, downgrade protection will be enabled for TLS connections that use certificates that chain to a public CA. This should not affect MITM proxies since they cannot use publicly-trusted certificates. However, in order to get to the point where this workaround can be removed, all affected MITM proxies will need to be updated. The following lists minimum firmware versions for affected products that we're aware of:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ePalo Alto Networks:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003ePAN-OS 8.1 must be \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e≥ \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e8.1.4\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePAN-OS 8.0 must be \u003c/span\u003e≥ \u003cspan style\u003d\"font-size:10pt\"\u003e8.0.14\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePAN-OS 7.1 must be \u003c/span\u003e≥ \u003cspan style\u003d\"font-size:10pt\"\u003e7.1.21\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eCisco \u003cspan style\u003d\"background-color:transparent\"\u003eFirepower \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThreat Defense and ASA with FirePOWER Services when\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e operating in “Decrypt - Resign mode/SSL Decryption Enabled”\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e(\u003c/span\u003e\u003ca href\u003d\"https://www.cisco.com/c/dam/en/us/td/docs/security/firepower/SA/SW_Advisory_CSCvj93913.pdf\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eadvisory\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e) :\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFirmware 6.2.3 must be \u003cspan style\u003d\"font-size:13.3333px\"\u003e≥ \u003c/span\u003e6.2.3.4\u003c/li\u003e\u003cli\u003eFirmware 6.2.2 must be ≥ 6.2.2.5\u003c/li\u003e\u003cli\u003eFirmware 6.1.0 must be ≥ 6.1.0.7\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eAdministrators can test compatibility by flipping \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003echrome://flags/#enforce-tls13-downgrade to Enabled\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ePlease report problems on the \u003c/span\u003e\u003ca href\u003d\"https://productforums.google.com/forum/#!forum/chrome-admins\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eadministrator's forum\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4852676552341181359"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/tls13"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1864792937204391037"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1864792937204391037"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1864792937204391037"}],"author":[{"name":{"$t":"Adam Langley"},"email":{"$t":"agl@chromium.org"}}],"sites$pageName":{"$t":"tls13"},"sites$revision":{"$t":"23"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1154967251494683476"},"published":{"$t":"2016-11-10T00:12:59.508Z"},"updated":{"$t":"2019-01-17T06:35:01.563Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:34:58.722Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Generic Chrome OS Device Instructions"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Developer-Mode\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDeveloper Mode\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction1\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Entering\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eEntering\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Leaving\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eLeaving\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003eUnfortunately, a page specific to your device does not yet exist. This page contains generic information for working with your Chrome OS device that is interesting and/or useful to software developers. It should hopefully work for your device, but there are no guarantees.\u003c/p\u003e\r\n\u003cp\u003eFor general information about getting started with developing on Chromium OS (the open-source version of the software on the Chrome Notebook), see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\"\u003eChromium OS Developer Guide\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Developer-Mode\" /\u003eDeveloper Mode\u003c/h2\u003e\r\n\u003cp\u003e\u003cb\u003eCaution: Modifications you make to the system are not supported by Google, may cause hardware, software or security issues and may void warranty.\u003c/b\u003e\u003c/p\u003e\r\n\u003cp\u003eAn unrelated note: Holding just Refresh and poking the Power button hard-resets the machine without entering Recovery. That's occasionally useful, but use it with care - it doesn't sync the disk or shut down politely, so there's a nonzero chance of trashing the contents of your stateful partition.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Introduction1\" /\u003eIntroduction\u003c/h3\u003e\r\n\u003cp\u003eEnabling Developer mode (dev mode) is the first step to tinkering with your Chromebook. With Developer mode enabled you can do things like poke around on a command shell (as root if you want), install Chromium OS, or try other OS's. Note that Developer mode turns off some security features like verified boot and disabling the shell access. If you want to browse in a safer, more secure way, leave Developer mode turned OFF.\u003c/p\u003e\u003cp\u003eNote: Switching between Developer and Normal (non-developer) modes will remove user accounts and their associated information from your Chromebook.\u003c/p\u003e\u003cp\u003eNote: \"dev mode\" and \"dev channel\" are completely independent features (even if they have very similar names). If you simply want to switch to the dev channel, see the \u003ca href\u003d\"https://support.google.com/chromebook/answer/1086915\"\u003echannel switching documentation\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Entering\" /\u003eEntering\u003c/h3\u003e\r\n\u003cp\u003ePlease see our new \u003cspan style\u003d\"background-color:transparent\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/debug_buttons.md\"\u003eDebug Button Shortcuts document\u003c/a\u003e for more details. It explains different form factors too.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Leaving\" /\u003eLeaving\u003c/h3\u003e\r\n\u003cp\u003eTo leave Dev-mode and go back to normal mode, just follow the instructions at the scary boot screen. It will prompt you to confirm.\u003c/p\u003e\r\n\u003cp\u003eIf you want to leave Dev-mode programmatically, you can run \u003ccode\u003ecrossystem disable_dev_request\u003d1; reboot\u003c/code\u003e from a root shell. There's no way to enter Dev-mode programmatically, and just seeing the Recovery screen isn't enough - you have to use the three-finger salute which hard-resets the machine first. That's to prevent a remote attacker from tricking your machine into dev-mode without your knowledge.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1154967251494683476"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1154967251494683476"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1154967251494683476"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"generic"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5177812537414769628"},"published":{"$t":"2019-01-17T00:06:53.740Z"},"updated":{"$t":"2019-01-17T06:26:20.759Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:26:20.759Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5177812537414769628"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5177812537414769628"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5177812537414769628"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2019-01-16"},{"index":"B","name":"OEM","$t":"PCmerge"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003ePCmerge Chromebook AL116\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Whitetip"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R71"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"yes"}]},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8442751741207211894"},"published":{"$t":"2018-11-14T22:49:36.377Z"},"updated":{"$t":"2019-01-17T06:26:02.627Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:26:02.626Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8442751741207211894"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8442751741207211894"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8442751741207211894"}],"author":[{"name":{"$t":"Vincent Wang"},"email":{"$t":"vwang@chromium.org"}}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Release","$t":"2018-10-26"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebook 13 / Spin 13\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Akali / Akali360"},{"index":"E","name":"Board name(s)","$t":"nami"},{"index":"F","name":"Base board","$t":"nami"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7627079620903745421"},"published":{"$t":"2018-10-26T21:35:49.671Z"},"updated":{"$t":"2019-01-17T06:25:14.095Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:25:14.095Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7627079620903745421"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7627079620903745421"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7627079620903745421"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2018-10-26"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eYoga Chromebook C630\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"pantheon"},{"index":"E","name":"Board name(s)","$t":"pantheon"},{"index":"F","name":"Base board","$t":"nami"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6970493778726636652"},"published":{"$t":"2018-10-26T21:45:40.681Z"},"updated":{"$t":"2019-01-17T06:24:58.903Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:24:58.903Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6970493778726636652"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6970493778726636652"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6970493778726636652"}],"author":[{"name":{"$t":"Steven Houtchens"},"email":{"$t":"stevenh@google.com"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-10-26"},{"index":"B","name":"OEM","$t":"Dell"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eDell Inspiron 14 2-in-1 Model 7486\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"vayne"},{"index":"E","name":"Board name(s)","$t":"vayne"},{"index":"F","name":"Base board","$t":"nami"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3379592049256450828"},"published":{"$t":"2018-10-24T17:28:15.425Z"},"updated":{"$t":"2019-01-17T06:24:39.451Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:24:39.450Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3379592049256450828"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3379592049256450828"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3379592049256450828"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-09-17"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eLenovo Chromebook S330\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"maple14"},{"index":"E","name":"Board name(s)","$t":"hana"},{"index":"F","name":"Base board","$t":"oak"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.18"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"MT8173"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"M67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2269369430605664003"},"published":{"$t":"2018-10-24T17:18:17.118Z"},"updated":{"$t":"2019-01-17T06:24:22.945Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:24:22.944Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2269369430605664003"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2269369430605664003"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2269369430605664003"}],"author":[{"name":{"$t":"Allan Almiranez"},"email":{"$t":"allanalmiranez@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-08-31"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eLenovo Chromebook C330\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"maple"},{"index":"E","name":"Board name(s)","$t":"hana"},{"index":"F","name":"Base board","$t":"oak"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.18"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"MT8173"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/271867025168335944"},"published":{"$t":"2018-06-27T01:27:24.006Z"},"updated":{"$t":"2019-01-17T06:24:04.615Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-17T06:24:04.615Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/271867025168335944"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/271867025168335944"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/271867025168335944"}],"author":[{"name":{"$t":"Saurabh Madan"},"email":{"$t":"ssmadan@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-14"},{"index":"B","name":"OEM","$t":"Samsung"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eSamsung Chromebook Plus (V2)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Nautilus"},{"index":"E","name":"Board name(s)","$t":"nautilus"},{"index":"F","name":"Base board","$t":"poppy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-Y"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"WSl7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8503583768529974893"},"published":{"$t":"2010-09-29T22:16:41.384Z"},"updated":{"$t":"2019-01-15T18:12:49.640Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-15T18:12:01.890Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"C++ Dos and Don'ts"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe page has moved to being checked in to the source tree.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++-dos-and-donts.md\"\u003eC++ Dos and Don'ts\u003c/a\u003e.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1724331143067532806"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/coding-style/cpp-dos-and-donts"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8503583768529974893"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8503583768529974893"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8503583768529974893"}],"author":[{"name":{"$t":"Elliot Glaysher"},"email":{"$t":"erg@chromium.org"}}],"sites$pageName":{"$t":"cpp-dos-and-donts"},"sites$revision":{"$t":"50"}},{"gd$etag":"\"KXsmYD1REQ..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1724331143067532806"},"published":{"$t":"2008-08-29T01:57:00.566Z"},"updated":{"$t":"2019-01-15T18:12:33.460Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-07-06T22:29:22.612Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Coding Style"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe style guide has moved to being checked in to the source tree.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee the general \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/styleguide.md\"\u003eChromium coding style\u003c/a\u003e and the specific \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/styleguide/c++/c++.md\"\u003eChromium C++ style guide\u003c/a\u003e.\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/coding-style"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1724331143067532806"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1724331143067532806"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1724331143067532806"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"coding-style"},"sites$revision":{"$t":"187"}},{"gd$etag":"\"WCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5820233441678935401"},"published":{"$t":"2012-09-20T21:02:03.177Z"},"updated":{"$t":"2019-01-11T13:47:01.724Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-11T13:46:58.086Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Smart Pointer Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-are-smart-pointers-\" /\u003eWhat are smart pointers?\u003c/h2\u003e\r\n\u003cp\u003eSmart pointers are a specific kind of \"scoping object\". They are like regular pointers but can automatically deallocate the object they point to when they go out of scope. Since C++ is not a garbage collected language, such functionality is important. The pattern where scoping objects are used to automatically manage the lifetime of heap-allocated objects is called RAII - \u003cb\u003eR\u003c/b\u003eesource \u003cb\u003eA\u003c/b\u003ecquisition \u003cb\u003eI\u003c/b\u003es \u003cb\u003eI\u003c/b\u003enitialization.\u003c/p\u003e\r\n\u003cp\u003eHere's some sample use of \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e, the most common type of smart pointer:\r\n\u003c/p\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003ccode\u003e\r\n\u003cpre\u003e// We can put a pointer into a std::unique_ptr\u0026lt;\u0026gt; at construction time...\r\n\u003cspan style\u003d\"font-size:13.3333px;white-space:normal\"\u003estd::unique_ptr\u003c/span\u003e value(base::JSONReader::Read(data));\r\n\u003cspan style\u003d\"font-size:13.3333px;white-space:normal\"\u003estd::unique_ptr\u003c/span\u003e foo_ptr(new Foo(...));\r\n\r\n// ...or by using reset().\r\n\u003cspan style\u003d\"font-size:13.3333px;white-space:normal\"\u003estd::unique_ptr\u003c/span\u003e bar_ptr; // Like \"Bar* bar_ptr \u003d nullptr;\".\r\nbar_ptr.reset(new Bar(...)); // Now |bar_ptr| is non-nullptr and owns the object.\r\n\r\n// We can test the \u003cspan style\u003d\"font-size:13.3333px;white-space:normal\"\u003estd::unique_ptr\u003c/span\u003e\u0026lt;\u0026gt; directly.\r\nif (!value)\r\n return false;\r\n\r\n// get() accesses the raw pointer underneath.\r\nFoo* raw_ptr \u003d foo_ptr.get();\r\n\r\n// We can call through the \u003cspan style\u003d\"font-size:13.3333px;white-space:normal\"\u003estd::unique_ptr\u003c/span\u003e\u0026lt;\u0026gt; as if it were a raw pointer.\r\nDictionaryValue* dict;\r\nif (!value-\u0026gt;GetAsDictionary(\u0026amp;dict))\r\n return false;\u003c/pre\u003e\r\n\u003c/code\u003e\u003c/blockquote\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Why-do-we-use-them-\" /\u003eWhy do we use them?\u003c/h2\u003e\r\n\u003cp\u003eSmart pointers ensure we properly destroy an object even if its creation and destruction are widely separated. They make functions simpler and safer by ensuring that no matter how many different exit paths exist, local objects are always cleaned up correctly. They help enforce that exactly one object owns another object at any given time, preventing both leaks and double-frees. Finally, their use clarifies ownership transference expectations at function calls.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-types-of-smart-pointers-exist-\" /\u003eWhat types of smart pointers exist?\u003c/h2\u003e\r\n\u003cp\u003eThe two common smart pointers in Chromium are \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e and \u003ccode\u003escoped_refptr\u0026lt;\u0026gt;\u003c/code\u003e. The former is used for singly-owned objects, while the latter is used for reference-counted objects (though normally you should avoid these -- see below). If you're familiar with C++11, \u003ccode\u003escoped_refptr\u0026lt;\u0026gt;\u003c/code\u003e is similar in intent to \u003ccode\u003estd::shared_ptr\u0026lt;\u0026gt;\u003c/code\u003e.\u003c/p\u003e\r\n\u003cp\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/base/memory/\"\u003ebase/memory/\u003c/a\u003e has a few other objects of interest:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e is not actually a smart pointer; it functions like a pointer type, but rather than being used to automatically free objects, it's used to track whether an object owned elsewhere is still alive. When the object is destroyed, the \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e will be automatically set to null, so you can see that it's no longer alive. (You still need to test for null before dereferencing -- a blind dereference of a null \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e is the equivalent of dereferencing null, rather than a no-op.) This is somewhat like C++11's \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003estd::weak_ptr\u0026lt;\u0026gt;\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, but with a different API and fewer restrictions.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-When-do-we-use-each-smart-pointer-\" /\u003eWhen do we use each smart pointer?\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eSingly-owned objects\u003c/b\u003e - use \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e. Specifically, these are for non-reference-counted, heap-allocated objects that you own.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eNon-owned objects\u003c/b\u003e - use raw pointers or \u003ccode\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e. Note that \u003ccode\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003es must only be dereferenced on the same thread where they were created (usually by a \u003ccode\u003eWeakPtrFactory\u0026lt;\u0026gt;\u003c/code\u003e), and if you need to take some action immediately before or after an object is destroyed, you'd likely be better-served with some sort of callback or notification instead of a \u003ccode\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eRef-counted objects\u003c/b\u003e - use \u003ccode\u003escoped_refptr\u0026lt;\u0026gt;\u003c/code\u003e, but better yet, rethink your design. Reference-counted objects make it difficult to understand ownership and destruction order, especially when multiple threads are involved. There is almost always another way to design your object hierarchy to avoid refcounting. Avoiding refcounting in multithreaded situations is usually easier if you restrict each class to operating on just one thread, and use \u003ccode\u003ePostTask()\u003c/code\u003e and the like to proxy calls to the correct thread. \u003ccode\u003ebase::Bind()\u003c/code\u003e, \u003ccode\u003eWeakPtr\u0026lt;\u0026gt;\u003c/code\u003e, and other tools make it possible to automatically cancel calls to such an object when it dies. Note that too much of our existing code uses refcounting, so just because you see existing code doing it does not mean it's the right solution. (Bonus points if you're able to clean up such cases.)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ePlatform-specific types\u003c/b\u003e - use one of the many platform-specific scoping objects, such as \u003ccode\u003ebase::win::ScopedHandle\u003c/code\u003e, \u003ccode\u003ebase::win::ScopedComPtr\u003c/code\u003e, or \u003ccode\u003ebase::mac::ScopedCFTypeRef\u003c/code\u003e. Note that these may have slightly different usage patterns than \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e; for example, they might be assigned as outparams via a \u003ccode\u003e.receive()\u003c/code\u003e type of method.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-are-the-calling-conventions-involving-different-kinds-of-pointers-\" /\u003eWhat are the calling conventions involving different kinds of pointers?\u003c/h2\u003e\r\n\u003cp\u003eSee the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/coding-style?pli\u003d1#TOC-Object-ownership-and-calling-conventions\"\u003ecalling conventions section of the Chromium style guide\u003c/a\u003e for the rules; some common cases are illustrated below.\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eIf a function \u003cb\u003etakes\u003c/b\u003e a \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e, that means it takes ownership of the argument. Callers need to use \u003ccode\u003estd::move()\u003c/code\u003e to indicate that they're passing ownership if the object being passed is not a temporary:\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003ccode\u003e\r\n\u003cpre\u003e// Foo() takes ownership of |bar|.\r\nvoid Foo(std::unique_ptr\u0026lt;Bar\u0026gt; bar);\r\n\r\n...\r\nstd::unique_ptr\u0026lt;Bar\u0026gt; bar_ptr(new Bar());\r\nFoo(std::move(bar_ptr)); // After this statement, |bar_ptr| is null.\r\nFoo(std::unique_ptr\u0026lt;Bar\u0026gt;(new Bar())); // No need to use std::move() on temporaries.\u003c/pre\u003e\r\n\u003c/code\u003e\u003c/blockquote\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eIf a function \u003cb\u003ereturns\u003c/b\u003e a \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e, that means the caller takes ownership of the returned object. Usage of \u003ccode\u003estd::move()\u003c/code\u003e while returning an object is only needed if the return type of the function differs from the type of the local variable.\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003ccode\u003e\r\n\u003cpre\u003eclass Base { ... };\r\nclass Derived : public Base { ... };\r\n\r\n// Foo takes ownership of |base|, and the caller takes ownership of the returned\r\n// object.\r\nstd::unique_ptr\u0026lt;Base\u0026gt; Foo(std::unique_ptr\u0026lt;Base\u0026gt; base) {\r\n if (cond) {\r\n return base; // Transfers ownership of |base| back to\r\n // the caller.\r\n }\r\n\r\n // Note that on these next codepaths, |base| is deleted on exit.\r\n if (cond2) {\r\n return std::unique_ptr\u0026lt;Base\u0026gt;(new Base())); // No std::move() necessary on temporaries.\r\n }\r\n std::unique_ptr\u0026lt;Derived\u0026gt; derived(new Derived());\r\n return std::move(derived); // Note that std::move() is necessary because\r\n // type of |derived| is different from the return\r\n // type of the function.\r\n}\u003c/pre\u003e\r\n\u003c/code\u003e\u003c/blockquote\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eIf a function takes or returns a raw pointer, it may mean no ownership is transferred, or it may not. Much of Chromium was written before \u003ccode\u003estd::unique_ptr\u0026lt;\u0026gt;\u003c/code\u003e existed, or by people unfamiliar with using it to indicate ownership transfers, and thus takes or returns raw pointers but transfers ownership in the process. Because the compiler can't enforce correct behavior here, this is less safe. Consider cleaning up such code, so that functions which take or return raw pointers never transfer ownership.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-about-passing-or-returning-a-smart-pointer-by-reference-\" /\u003eWhat about passing or returning a smart pointer by reference?\u003c/h2\u003e\r\n\u003cp\u003eDon't do this.\u003c/p\u003e\r\n\u003cp\u003eIn principle, passing a \u003ccode\u003econst std::unique_ptr\u0026lt;T\u0026gt;\u0026amp;\u003c/code\u003e to a function which does not take ownership has some advantages over passing a \u003ccode\u003eT*\u003c/code\u003e: the caller can't accidentally pass in something utterly bogus (e.g. an \u003ccode\u003eint\u003c/code\u003e converted to a \u003ccode\u003eT*\u003c/code\u003e), and the caller is forced to guarantee the lifetime of the object persists across the function call. However, this declaration also forces callers to heap-allocate the objects in question, even if they could otherwise have declared them on the stack. Passing such arguments as raw pointers decouples the ownership issue from the allocation issue, so that the function is merely expressing a preference about the former. For the sake of simplicity and consistency, we avoid asking authors to balance these tradeoffs, and simply say to always use raw pointers.\u003c/p\u003e\r\n\u003cp\u003eOne exception is lambda functions used with STL algorithms operating on containers of smart pointers; these may have to take e.g. \u003ccode\u003econst std::unique_ptr\u0026lt;T\u0026gt;\u0026amp;\u003c/code\u003e in order to compile. And speaking of that...\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-I-want-to-use-an-STL-container-to-hold-pointers.-Can-I-use-smart-pointers-\" /\u003eI want to use an STL container to hold pointers. Can I use smart pointers?\u003c/h2\u003e\r\n\u003cp\u003eYes! As of C++11, you can store smart pointers in STL containers.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-General-references-on-smart-pointers\" /\u003eGeneral references on smart pointers\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one\" rel\u003d\"nofollow\"\u003eStackOverflow guide to smart pointers\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Smart_pointer\" rel\u003d\"nofollow\"\u003eWikipedia article on smart pointers\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.webkit.org/coding/RefPtr.html\" rel\u003d\"nofollow\"\u003eGuide to smart pointer usage in WebKit\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/smart-pointer-guidelines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5820233441678935401"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5820233441678935401"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5820233441678935401"}],"author":[{"name":{"$t":"Peter Williamson"},"email":{"$t":"petewil@chromium.org"}}],"sites$pageName":{"$t":"smart-pointer-guidelines"},"sites$revision":{"$t":"21"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1002937672117737946"},"published":{"$t":"2013-05-15T01:34:52.434Z"},"updated":{"$t":"2019-01-10T16:44:05.612Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-10T16:44:03.255Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Basic Ebuild Troubleshooting"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3 align\u003d\"left\"\u003e\u003ca name\u003d\"TOC-This-is-a-brief-explanation-of-how-one-might-trouble-shoot-local-emerge-ebuild-failures.-It-is-in-no-way-comprehensive-and-is-only-meant-as-an-introduction-to-the-topic:\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small;font-weight:normal;white-space:pre-wrap\"\u003eThis is a brief explanation of how one might trouble shoot local emerge/ebuild failures\u003c/span\u003e\u003cspan style\u003d\"font-size:small;font-weight:normal;white-space:pre-wrap\"\u003e. It is in no way comprehensive, and is only meant as an introduction to the topic\u003c/span\u003e\u003cfont style\u003d\"font-size:small;font-weight:normal;line-height:12.727272033691406px;white-space:pre-wrap\"\u003e:\u003c/font\u003e\u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cb\u003eEmerge errors during build_image\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003eWhen following the \u003ca href\u003d\"http://dev.chromium.org/chromium-os/developer-guide\" target\u003d\"_blank\"\u003eChromium OS Developer Guide\u003c/a\u003e emerge errors can be encountered for missing ebuild. A error that can be encountered when running build_image is:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003eemerge: there are no ebuilds to satisfy XYZ\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003eWhere XYZ is a library or other missing package.\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003eThis can be resolved by running:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge-$BOARD XYZ\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003eThen recalling build_image:\u003c/span\u003e\u003c/font\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e./build_image --board\u003d${BOARD} --noenable_rootfs_verification dev\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cspan style\u003d\"line-height:12.7273px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:small;font-weight:normal;line-height:12.727272033691406px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:907.272705078125px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eReferences:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003c/span\u003e[1] \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-user-doc\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest ebuild documentation\u003c/span\u003e\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003c/span\u003e[2]\u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide/chromite-shell-quick-start\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e Chromite documentation\u003c/span\u003e\u003c/a\u003e\u003c/font\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eFrom within the chroot, try running the a new test through run_remote_tests, as described in the codelab on autotest client tests, without actually adding it to an ebuild. This might give you an error about not being able to find kernel_HdParmBasic’s control file.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eTo resolve this, from within chroot:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e1. Find the package with autotest tests:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge --search autotest | grep tests\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e2. Dry emerge it and look for your test in the output:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge-lumpy -pv chromeos-base/autotest-tests\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e    \u003cu\u003eTwo things to note:\u003c/u\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003e    a. The first line will say something like: “chromeos-base/autotest-tests-0.0.1-r3531“\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15;text-indent:36pt\"\u003e     This means it’s emerging the r3531 ebuild. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15;text-indent:36pt\"\u003e\u003cspan\u003e    \u003cspan\u003e   \u003c/span\u003e\u003c/span\u003eSince we would like it to \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15;text-indent:36pt\"\u003euse our local bits, we need to cros_workon the package.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e    b. You will not find kernel_HdParmBasic in the output.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e3. cros_workon the appropriate package:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(0,136,0);line-height:1.15;text-indent:36pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecros_workon --board\u003d\u0026lt;board name\u0026gt; start \u0026lt;package name\u0026gt;\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003e    eg: cros_workon --board\u003dlumpy start autotest-tests\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(0,136,0);line-height:1.15;text-indent:36pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge the package: emerge-\u0026lt;board name\u0026gt; \u0026lt;package name\u0026gt;\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15;text-indent:36pt\"\u003e    eg: emerge-lumpy -pv chromeos-base/autotest-tests\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e    \u003cu\u003eTwo things to note:\u003c/u\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003ea. The first line will say something like:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e“chromeos-base/autotest-tests-9999”\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e This is good, it means it’s pulling local bits.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003eb. You still will not find kernel_HdParmBasic in the output.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e This is because your new test hasn’t been added to the ebuild yet.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e4. Edit the ebuild to include your test:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"white-space:pre\"\u003e \u003c/span\u003eFind the ebuild file: find -iname “autotest-tests-9999.ebuild” from src/third_party/. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e      a. It will most probably point you to:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e            third_party/chromiumos-overlay/chromeos-base/autotest-tests/autotest-tests-9999.ebuild. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:arial,sans-serif;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e      b. open this file and add “+test_kernel_HdParmBasic” in the IUSE_TESTS section.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline\"\u003e5. Emerge the new folder:\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e     a. Make sure you’re cros_working on the right packages:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e       \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e cros_workon --board\u003dlumpy list\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e        should show autotest_tests\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e     b. Make sure the emerge will touch kernel_HdParmBasic:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e        \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge-lumpy -pv chromeos-base/autotest-tests | grep kernel_HdParmBasic\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e     c. Actual emerge:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e        \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eemerge-lumpy chromeos-base/autotest-tests\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    \u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e6. Check the staging area for your new test:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e      eg: \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003els /build/lumpy/usr/local/autotest/client/site_tests/kernel_HdParmBasic\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"white-space:pre-wrap;font-size:small\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e7. Re-run the run_remote command and look for the results directory:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    you should see a line like:\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,136,0);background-color:transparent;vertical-align:baseline\"\u003e        \u0026gt;\u0026gt;\u0026gt; Details stored under /tmp/run_remote_tests.KTQ4\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e    Alternatively, you can specify your own results directory using ‘--results_dir_root’. \u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"white-space:pre-wrap;font-size:small\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;font-size:small;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSome common ebuilds to cros_workon and emerge:\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e \u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"white-space:pre-wrap;font-size:small;font-family:courier new,monospace\"\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003eautotest-all (Meta ebuild for all packages providing tests), \u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003eautotest-factory (Autotest Factory tests), \u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003eautotest-chrome (Autotest tests that require chrome_test or pyauto deps), \u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003eautotest-tests (Pure Autotest tests),  \u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;line-height:1.15\"\u003eautotest (Autotest scripts and tools).\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv style\u003d\"white-space:pre-wrap;font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you have come this far, you may also be interested in reading the autotest client tests \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-code-labs/autotest-client-tests\" target\u003d\"_blank\"\u003ecodelab\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap;font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003eAccess Violation Errors when Emerging\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhen you're attempting to include a file from another project, for example\r\n\r\n\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#include \u0026lt;shill/net/rtnl_handler.h\u0026gt;\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\r\nYour build may fail with access violations, e.g.\r\n\r\n\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e...\r\narc-networkd-9999: [0/3] CXX obj/arc/network/arc-networkd.manager.o * ACCESS DENIED: open_rd: /mnt/host/source/src/platform2/shill/net/rtnl_listener.h\r\narc-networkd-9999: * ACCESS DENIED: open_rd: /mnt/host/source/src/platform2/shill/net/shill_export.h\r\narc-networkd-9999: * ACCESS DENIED: open_rd: /mnt/host/source/src/platform2/shill/net/rtnl_listener.h\r\narc-networkd-9999: * ACCESS DENIED: open_rd: /mnt/host/source/src/platform2/shill/net/shill_export.h\r\narc-networkd-9999: \r\narc-networkd-9999: [1/3] CXX obj/arc/network/arc-networkd.manager.o\r\narc-networkd-9999: FAILED: obj/arc/network/arc-networkd.manager.o \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\r\nThe proper way to handle this is to make sure that the ebuild for the package you are including a file from (in this case, shill), is installing the necessary headers to /usr/include. This should look like:\r\n\r\n\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003esrc_install() {\r\n\t# ... \r\n\tinsinto /usr/include/[package_name]\r\n\tdoins header_one.h\r\n\tdoins header_two.h\r\n\t# ...\r\n}\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNotably, it is \u003cb\u003eincorrect\u003c/b\u003e to add the package name you are depending on to your package's ebuild under CROS_WORKON_SUBTREE.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8590908504692658353"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-code-labs/autotest-client-tests/basic-ebuild-troubleshooting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1002937672117737946"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1002937672117737946"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1002937672117737946"}],"author":[{}],"sites$pageName":{"$t":"basic-ebuild-troubleshooting"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"XSl7JmA1\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3585491094165374254"},"published":{"$t":"2011-03-31T18:48:10.443Z"},"updated":{"$t":"2019-01-04T22:51:45.328Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2019-01-04T22:51:43.025Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium Commit Queue"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\" /\u003e\u003cp\u003eNo headings.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"5\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/infra/cq.md\"\u003e//docs/infra/cq.md\u003c/a\u003e\u003c/font\u003e\u003cbr /\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eSee also: \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:359411dde4d9a4a3\" style\u003d\"font-size:10pt;background-color:transparent\" class\u003d\"disabled\"\u003eChromium OS Commit Queue\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e.\u003cbr /\u003e\u003c/span\u003e\u003cdiv\u003e\u003cdiv\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/commit-queue"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3585491094165374254"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3585491094165374254"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3585491094165374254"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$pageName":{"$t":"commit-queue"},"sites$revision":{"$t":"94"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8463898314364005691"},"published":{"$t":"2010-09-22T00:21:50.252Z"},"updated":{"$t":"2019-01-03T00:25:31.784Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2017-06-19T21:40:47.275Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Get Bug-Editing Privileges"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent\"\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-are-bug-editing-privileges-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eWhat are bug-editing privileges?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-get-bug-editing-privileges-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eHow do I get bug-editing privileges?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-are-bug-editing-privileges-\" /\u003eWhat are bug-editing privileges?\u003c/h2\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eAnyone can file bugs and add comments to bugs, but some things—adding labels, marking duplicates, changes status—require extra permissions.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThere’s \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/bug-triage\"\u003eplenty you can do to help with triage\u003c/a\u003e without any extra permissions, but if you are doing a lot of triage you can be even more effective if you can edit bugs. Just as with \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/become-a-committer\"\u003ebecoming a committer\u003c/a\u003e, however, these extra permissions comes with an expectation of responsibility.\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-get-bug-editing-privileges-\" /\u003eHow do I get bug-editing privileges?\u003c/h2\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ci\u003e\u003cb\u003eNote:\u003c/b\u003e The instructions below are for someone who is getting involved specifically through triage. If you need bug editing permissions for some other reason, and someone on the Chromium team can vouch for you, that person should nominate you directly via the committers@chromium.org list.\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-style:normal;font-weight:normal;margin:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003eFirst, spend at least a few weeks triaging bugs as described in the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/bug-triage\" style\u003d\"font-style:normal;font-weight:normal\"\u003etriage guidelines\u003c/a\u003e, doing the parts that don't require extra permissions and aiming to make significant contributions to at least 20-30 bugs. This is to demonstrate that you are committed to helping triage bugs, that you understand the triage process, and that you can work with the rest of the Chromium community.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce you’ve done that, email a Chromium contributor who is familiar with your triage work (for instance, a developer who has worked with some of the bugs you have triaged) and ask them to\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e review your triage contributions; include a reference to this page since they may not be familiar with the process. They should either provide feedback, or start the formal nomination process with the committers list (if they aren't sure how to evaluate, or nominate, they can email accounts@ to ask for help). As with becoming a committer, the final decision will be made by the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:normal;font-style:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ecommitters@chromium.org\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e list.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eA few things to keep in mind while you are getting started with triage, which will help ensure that the nomination process goes smoothly:\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eBe polite in bugs. When you triage bugs, your comments will often be seen by bug reporters as representing the Chromium project.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eBe professional. Again, your comments will be viewed in a different light when you have more privileges in the bug system. Don’t make disparaging comments about specific sites, browsers, people, etc.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eKeep triaging separate from opinion. You may not agree with a feature request or a claim that a certain behavior is a bug, but as a triager your job is to get that bug routed to the right people to evaluate it, not to make a decision about whether it should be implemented.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOnce your nomination is approved, you will receive a follow-up email with instructions for enabling your new permissions. \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003eGoogler?\u003c/b\u003e You can request a Chromium account or join the \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ci\u003echromium-bug-access\u003c/i\u003e group.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2547469806500607582"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/getting-involved/get-bug-editing-privileges"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8463898314364005691"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8463898314364005691"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8463898314364005691"}],"author":[{"name":{"$t":"Stuart Morgan"},"email":{"$t":"stuartmorgan@chromium.org"}}],"sites$pageName":{"$t":"get-bug-editing-privileges"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/94741134965390265"},"published":{"$t":"2015-05-06T18:58:01.703Z"},"updated":{"$t":"2018-12-26T22:20:42.153Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-12-26T22:20:39.027Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GRIT User's Guide"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-1\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Getting-Started\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eGetting Started\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Adding_Resources\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eAdding Resources\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Outputs_and_Translations\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eOutputs and Translations\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#GRIT_Cookbook\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eGRIT Cookbook\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Miscellaneous_GRIT_extensions_and_tips\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eMiscellaneous GRIT extensions and tips\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Migrating_Your_Project\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eMigrating Your Project\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"TOC-Getting-Started\" /\u003eGetting Started\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13.12px\"\u003eYour chromium checkout contains GRIT.  Run .\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:12.2016px\"\u003e\u003cfont face\u003d\"Monaco, DejaVu Sans Mono, Bitstream Vera Sans Mono, Lucida Console, monospace\"\u003e/tools/grit/grit.py \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13.12px;background-color:transparent\"\u003efor help. GRIT integrates easily with \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/p/gyp/\" rel\u003d\"nofollow\" style\u003d\"font-family:arial,sans-serif;font-size:13.12px;background-color:transparent;color:rgb(0,0,204)\"\u003eGYP\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13.12px;background-color:transparent\"\u003e, see \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#search/\u0026amp;q\u003dgrit%20file:%5C.gyp\u0026amp;sq\u003dpackage:chromium\u0026amp;type\u003dcs\" rel\u003d\"nofollow\" style\u003d\"font-family:arial,sans-serif;font-size:13.12px;background-color:transparent;color:rgb(0,0,204)\"\u003eexamples\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13.12px;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eIt's a good idea to run GRIT's unit tests to check that your installation is OK. Run \u003c/span\u003e\u003ctt style\u003d\"background-color:transparent;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016px;max-width:66em\"\u003egrit unit\u003c/tt\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e, which should print the result of the tests, ending with OK.\u003c/span\u003e\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Creating_a_Blank_.grd_File\" /\u003eCreating a Blank .grd File\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eYou can run \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit newgrd\u003c/tt\u003e to create a new \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file with no content but a skeleton to start you off with.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIf you're looking to convert an existing \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e file to the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e format, see the section \"Converting Your RC File to GRIT Format\" below.\u003c/p\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Adding_Resources\" /\u003eAdding Resources\u003c/h1\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Includes_(e.g._GIF,_BMP,_ICO_etc.)\" /\u003eIncludes (e.g. GIF, BMP, ICO etc.)\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eHere are the steps to add an included resource, e.g. a GIF or BMP. Note that this does not include HTML templates, those are considered \"structures\" (see section below).\u003c/p\u003e\u003col style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eOpen your project's .grd file.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eFind the latest \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element (the one with the highest number in the 'seq' attribute). These elements group together resources that are part of the same public release. Note that some projects always use just a single \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eUnder that \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element, find an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;includes\u0026gt;\u003c/tt\u003e element.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eAdd an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;include\u0026gt;\u003c/tt\u003e element to the end of that \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;includes\u0026gt;\u003c/tt\u003e element. The \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;include\u0026gt;\u003c/tt\u003e element has the following attributes, and no body:\u003c/li\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003etype: This goes into the RC file verbatim, so it is the resource type string you want to use for this include, e.g. 'GIF'\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003ename: This is the textual ID of this resource. GRIT will generate a #define in the resource header file for this textual ID, so you can use it in your code as long as you include the resource header file.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003efile: This is the path to the file to include, \u003cstrong\u003erelative to the .grd file\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Messages_(what_used_to_go_into_the_string_table)\" /\u003ei18n Messages\u003c/h2\u003e\u003cdiv\u003e\u003ci\u003e\u003cb\u003eNote: readers are here advised to also read \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/ui-localization\"\u003eUI Localization (aka Translations)\u003c/a\u003e.\u003c/b\u003e\u003c/i\u003e\u003c/div\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eSimilarly for includes (above), find the latest \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element, then find a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;messages\u0026gt;\u003c/tt\u003e node under that. Add an i18n \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;message\u0026gt;\u003c/tt\u003e node under it. i18n \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;message\u0026gt;\u003c/tt\u003e nodes have the following attributes:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003ename\u003c/i\u003e: The textual ID of the message.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003edesc\u003c/i\u003e: A description of the message giving enough context to the translator to translate the message correctly (e.g. the message \"Shut\" might be a description of an action you need to take or the description of the status of something, so a description like e.g. \"Shut the current dialog; button label\" would help translators do the right thing).\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003emeaning\u003c/i\u003e: You can use this field to ensure that two messages that have the same text will not necessarily share the same translation. This can provide a bit of context to the translators along with the 'desc' attribute.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003einternal_comment\u003c/i\u003e: If you want to add a comment for use internally (by the developers) this is the place to put it.\u003c/li\u003e\u003c/ul\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe body of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;message\u0026gt;\u003c/tt\u003e element is the text of the message. Inline in the text, you should use \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e elements to indicate \u003ci\u003enon-translatable\u003c/i\u003e sections (human or automatic translators will leave the \u0026lt;ph\u0026gt; element content alone - they will not try to translate it). \u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e element has a single attribute, '\u003ci\u003ename\u003c/i\u003e', which you use to give the placeholder a name (which must be uppercase and should usually be descriptive, e.g. USER_NAME or TIME_REMAINING). Apart from the \u003ci\u003enon-translatable\u003c/i\u003e text, the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e element can contain a single\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ex\u0026gt;\u003c/tt\u003e element containing an example of what the placeholder could be replaced with. This is shown to the translators, and could be e.g. \"Jói\" for a placeholder with a name of USER_NAME.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eFor example:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ID_OF_MESSAGE\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  Hello \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ph\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"USER_NAME\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e%s\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ex\u0026gt;\u003c/span\u003e\u003cspan\u003eJoi\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/ex\u0026gt;\u0026lt;/ph\u0026gt;\u003c/span\u003e\u003cspan\u003e, how are you today?\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGRIT allows you to use messages that begin or end with whitespace. You need to put ''' (that's three single quotes, like Python's triple quotes) before leading whitespace and after trailing whitespace, because the default is to strip leading and trailing whitespace from messages.\u003c/p\u003e\u003ch3 style\u003d\"font-size:medium;border:0px;padding:0.5ex 0.5em 0.5ex 0px;margin:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"A_Concrete_Example\" /\u003eExample\u003c/h3\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGiven a message that looked like the following in the RC file:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan\u003eIDS_EMAIL_ESTIMATE \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"%d of about %d emails - \"\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThis should be represented as the following in the .grd file:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDS_EMAIL_ESTIMATE\"\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e         \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003einternal_comment\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"TODO make the placeholders reorderable so the translators can rearrange things\"\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e         \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003edesc\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"Shown at top of results page\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ph\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ITEM\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e%d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ex\u0026gt;\u003c/span\u003e\u003cspan\u003e1\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/ex\u0026gt;\u0026lt;/ph\u0026gt;\u003c/span\u003e\u003cspan\u003e of about \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ph\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ESTIMATED_TOTAL\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e%d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;ex\u0026gt;\u003c/span\u003e\u003cspan\u003e130\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/ex\u0026gt;\u0026lt;/ph\u0026gt;\u003c/span\u003e\u003cspan\u003e emails - '''\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eLet's walk through what's going on here:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe '\u003ci\u003ename\u003c/i\u003e' attribute of the message element is the symbolic ID of the message, that you use to refer to the message in e.g. your C++ code. GRIT generates a numeric ID for the message which goes into the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eresource.h\u003c/tt\u003e file\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe '\u003ci\u003edesc\u003c/i\u003e' attribute is a description of the message which should give the translators enough context to translate it properly. This is especially important for short messages such as a single word, where you have to at least disambiguate whether the word is a noun, verb, adjective, and whether it's used in a singular or plural context.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe '\u003ci\u003einternal_comment\u003c/i\u003e' attribute is for any comments related to this message that the translator should not see (e.g. TODO comments, comments on how to use in code, etc.)\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eWe change the two \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e%d\u003c/tt\u003e format specifiers into \"placeholders,\" which are represented by the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e element. Everything that should not be translated by the translators needs to be changed into a placeholder.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe '\u003ci\u003ename\u003c/i\u003e' attribute of the placeholder must be composed of the capital letters A-Z, numbers 0-9 and the underscore character. It should describe the placeholder succinctly. The placeholder names are used to provide the translator with translatable text, in this case \"ITEM of about ESTIMATED_TOTAL emails - \".\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe contents of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e element should be what you want your program to see, i.e. what goes into the compiled RC. Basically this is the original text.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eYou can (and should) add a single \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ex\u0026gt;\u003c/tt\u003e node as a child of the \u0026lt;ph\u0026gt; node. The contents of the \u0026lt;ex\u0026gt; node will be used to create an example of a \"final\" message to help the translators. This shows what the message might look like once all format specifiers have been filled in, in this case \"1 of about 130 emails - \"\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eBecause the message ends in a space character, and you don't want to lose that space character, you need to add a triple quote, ''', after the end of the message. This prevents GRIT from stripping the trailing whitespace. The triple quote does not become part of the message.\u003c/li\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Structures_(menus,_dialogs,_HTML_templates,_etc.)\" /\u003eStructures (menus, dialogs, HTML templates, etc.)\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eAny resource that is not a simple message and contains one or more translateable parts needs to be defined as a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e element. Similar to includes and messages (see above), you find the latest \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element, find a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structures\u0026gt;\u003c/tt\u003e node under that, and add a\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e node to it. \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e nodes have the following attributes:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003ename\u003c/i\u003e: The textual ID of the structure. For menus, dialogs and VERSIONINFO resources, this must match the ID used in the .rc file the structure is kept in.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003etype\u003c/i\u003e: The type of structure. This can be 'menu', 'dialog', 'version', 'rcdata', 'tr_html', 'txt' or 'admin_template'. The first four indicate a MENU, DIALOG (or DIALOGEX), VERSIONINFO or RCDATA resource in a .rc file. 'tr_html' indicates an HTML template, 'admin_template' indicates an .adm file (used for enterprise features on Windows) and 'txt' indicates a plain text file that needs to be translated for different languages.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ci\u003efile\u003c/i\u003e: The file, \u003cstrong\u003erelative to the .grd file\u003c/strong\u003e that the structure is kept in. If it is a structure type taken from an .rc file, the structure resides in the file along with possibly lots of other structures, and is looked up by its textual ID (the 'name' attribute). Otherwise it takes up the whole file (i.e. the whole contents of the file are the contents of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e element).\u003c/li\u003e\u003c/ul\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eNote that GRIT only has support for symbolic resource IDs (IDs that are preprocessor defines that are given a numeric value) and not for string literal resource IDs. The latter are suboptimal, since they increase the size of the resources. If the .rc file you point to uses string literal resource IDs, you will have to #define those string literals manually to use those resources. The recommended approach is to only use symbolic resource IDs.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Splitting_Resources_into_Multiple_Files\" /\u003eSplitting Resources into Multiple Files\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIt is possible to have 'sub' grd files, the ones with .grdp extension.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThey can be include in .grd files using the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;part\u0026gt;\u003c/tt\u003e element. See \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/app/bookmarks_strings.grdp\u0026amp;sq\u003dpackage:chromium\u0026amp;type\u003dcs\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003ethis example\u003c/a\u003e.\u003c/p\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Outputs_and_Translations\" /\u003eOutputs and Translations\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eBy calling \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit build\u003c/tt\u003e you make GRIT build RC files and resource header files from a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file. This section details how to specify which files to output, how to specify the translation files to use, and how to use conditional output of resources.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Specifying_Output_Files_and_Translation_Files\" /\u003eSpecifying Output Files and Translation Files\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe way you specify which files \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit build\u003c/tt\u003e should output is using an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;outputs\u0026gt;\u003c/tt\u003e section in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file. NOTE: The \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;outputs\u0026gt;\u003c/tt\u003e section should be put at the top of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file, as this can speed up GRIT when used with build systems that scan the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file for dependencies.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eTo specify the translation files to use, you use a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;translations\u0026gt;\u003c/tt\u003e section that points to each of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xtb\u003c/tt\u003e (translation bundle) files containing the translations.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe top of your \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file, including the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;outputs\u0026gt;\u003c/tt\u003e and \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;translations\u0026gt;\u003c/tt\u003e sections might look like this:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan\u003exml version\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1.0\"\u003c/span\u003e\u003cspan\u003e encoding\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;grit\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elatest_public_release\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"0\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003esource_lang_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"en\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ecurrent_release\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ebase_dir\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"../..\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eenc_check\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"möl\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;outputs\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;output\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efilename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"resource.h\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"rc_header\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;output\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efilename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"en/generated_resources_en.rc\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"rc_all\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elang\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"en\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;output\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efilename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"fr/generated_resources_fr.rc\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"rc_all\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elang\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"fr\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;output\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efilename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ja/generated_resources_ja.rc\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"rc_all\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elang\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ja\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/outputs\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;translations\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;file\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003epath\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"$TRANSLATIONS_FOLDER/fr.xtb\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elang\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"fr\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;file\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003epath\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"$TRANSLATIONS_FOLDER/ja.xtb\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003elang\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ja\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/translations\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Remainder of .grd file --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/grit\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eSomething to note here: The language code is included in the filename of each of the generated \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files, even though it is already a component of the files' paths. This is recommended to ensure that the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.res\u003c/tt\u003e intermediary files which are generated by the RC compiler from the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files and then linked into the executable do not share the same filename (as they may all be built into one directory even if the GRIT output files are in separate directories).\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Conditional_Output_of_Resources\" /\u003eConditional Output of Resources\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e file, it's common to use C preprocessor commands to control which parts of the file get output given the existence or values of C preprocessor defines. GRIT has this same capability, in addition to allowing output of resources to be conditional on which language is being output.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eTo use conditional output of resources, simply enclose some of your \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;message\u0026gt;\u003c/tt\u003e, \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e or \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;include\u0026gt;\u003c/tt\u003e elements in an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;if\u0026gt;\u003c/tt\u003e element. The 'if' element has a single attribute 'expr', the contents of which are evaluated as a Python expression, and the resources within the 'if' element are only output if the result of that expression is true. Your Python expression has access to the following objects and functions:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003elang\u003c/tt\u003e is the language code (\u003ca href\u003d\"http://en.wikipedia.org/wiki/IETF_language_tag\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003eIETF language tag\u003c/a\u003e) being output, taken directly from the 'lang' attribute of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;output\u0026gt;\u003c/tt\u003e node currently controlling the output.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003edefs\u003c/tt\u003e is a map of C preprocessor defines to their values, e.g. \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e{ 'SHIPPING' : True, '_DEBUG' : False }\u003c/tt\u003e. Note that preprocessor defines with values 1 and 0 get changed so their values are True and False, respectively.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003epp_ifdef(name)\u003c/tt\u003e behaves just like an #ifdef statement in the C preprocessor, i.e. it returns True if \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003ename\u003c/tt\u003e is defined (exists as a key in \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003edefs\u003c/tt\u003e).\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003epp_if(name)\u003c/tt\u003e behaves just like an #if statement in the C preprocessor, i.e. it returns True if and only if \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003ename\u003c/tt\u003e is defined and its value is true.\u003c/li\u003e\u003c/ul\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eNote that conditional output of resources only affects those output files of GRIT that determine which resources get linked into your executable, i.e. currently only the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files output. It has no effect on resource header files, or translation interchange files like \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xmb\u003c/tt\u003e files. This is desirable for several reasons, e.g. resource IDs stay the same regardless of conditional output, all messages always go to translation, etc.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Avoid_unnecessary_header_includes\" /\u003eAvoid unnecessary header includes\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGRIT by default includes some header files (for example: \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eatlres.h\u003c/tt\u003e). In order to avoid these includes you can use the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;emit\u0026gt;\u003c/tt\u003e tag as a child of\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;output\u0026gt;\u003c/tt\u003e. Doing this would replace all the includes with your customized includes. Including an empty \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;emit\u0026gt;\u003c/tt\u003e tag makes GRIT include no header files in the generated resource file.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;output\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efilename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"resource.grh\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"rc_header\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;emit\u0026gt;\u003c/span\u003e\u003cspan\u003e#include \"foo/bar.h\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/emit\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/output\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"GRIT_Cookbook\" /\u003eGRIT Cookbook\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThis section documents some common \"recipes\" for getting things done using GRIT.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Getting_Ready_for_Release\" /\u003eGetting Ready for Release\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eWhen you are about to release, you will probably want to make sure none of your messages get automatically pseudotranslated, i.e. you want to have 'grit build' fail if there are some missing translations. To achieve this goal, you simply add a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eallow_pseudo\u003d\"false\"\u003c/tt\u003e attribute to your\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e node (this attribute is true by default), e.g.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;release\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eseq\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eallow_pseudo\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!--\u003cbr /\u003e    If GRIT finds a missing translation for any message or any part\u003cbr /\u003e    of any structure within this element, it will fail rather than\u003cbr /\u003e    create an automatic pseudotranslation.\u003cbr /\u003e  --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    ...\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structures\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    ...\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/structures\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/release\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eWhen you start working on your next release, \u003cstrong\u003eleave everything inside that \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element alone\u003c/strong\u003e (or at least don't modify or add to it - OK to remove from it). Instead, create a new \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;release\u0026gt;\u003c/tt\u003e element and put the resources you add to your new release inside that element. If you need to modify one of the existing resources, move it from the old release to the new release, and modify it within the new release.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Language-Specific_Graphics_(or_Other_Included_Resources)\" /\u003eLanguage-Specific Graphics (or Other Included Resources)\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThere is often a need to localize graphics, e.g. logos that have text on them. It's easy to tell GRIT to use different logos for different languages:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;includes\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"2048\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang in ['de', 'en', 'es', 'fr', 'it']\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"GIF\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDR_LOGO\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"logo.gif\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'ja'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"GIF\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDR_LOGO\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ja_logo.gif\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'zh_cn'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"GIF\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDR_LOGO\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"zh_cn_logo.gif\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/includes\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eHere we use the same logo for English and FIGS languages, and different logos for Japanese and Simplified Chinese.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Language-Specific_Layout_of_Dialog_Boxes\" /\u003eLanguage-Specific Layout of Dialog Boxes\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIt's common for dialog boxes to require a different layout for languages other than English, as most languages are much more verbose than English (30-40% on average). Of course the best way to handle this is to make the dialog boxes for English roomy enough to account for all languages, but this is not always possible due to aesthetics or project constraints. Likewise, other structured resources, such as HTML templates, sometimes need to have locale-specific versions.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eAlthough you \u003ci\u003ecould\u003c/i\u003e use a few \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;if\u0026gt;\u003c/tt\u003e nodes to achieve something close to what you want, this would mean each of your different structured resource variants would need to be in English. It would be much more convenient to be able to have your variants in the target language (so that you can easily size e.g. the dialog correctly) yet pick up the source messages from the original structured resource. This is what the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;skeleton\u0026gt;\u003c/tt\u003enode is for.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eHere's how you would use it:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structures\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"4096\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- The file specified in the \u0026lt;structure\u0026gt; node is used except when one of the expressions\u003cbr /\u003e       in \u0026lt;skeleton\u0026gt; nodes is true. --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structure\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"dialog\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDD_DIALOG\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"structured_resources.rc\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- The variant_of_revision attribute is mandatory and intended to specify which source\u003cbr /\u003e         control revision number this skeleton variant is a variant of. Useful so that GRIT can\u003cbr /\u003e         automatically detect if you may need to update your skeleton (not implemented yet). --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;skeleton\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'ja'\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"ja\\IDD_DIALOG\\IDD_DIALOG.rc\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003evariant_of_revision\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"3\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/structure\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/structures\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eTo help you work with variant skeletons, there is a tool \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit resize\u003c/tt\u003e that will output a Microsoft Visual Studio project file and an .rc file containing the dialogs you request in the language you request. See \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit help resize\u003c/tt\u003e for more details.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eNOTE: The \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;skeleton\u0026gt;\u003c/tt\u003e node currently only works for structures with \u003ci\u003etype\u003d\"dialog\"\u003c/i\u003e. Support for it can be added to other structure types but usually what you want for e.g. HTML structures can usually be accomplished more easily by using separate files and selecting between them with \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;if\u0026gt;\u003c/tt\u003e nodes (see the above section).\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Language-Specific_Messages\" /\u003eLanguage-Specific Messages\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eOccasionally, there is a need for a message to have a different meaning in one language than it does in another. An example of this is that a Terms of Use document might have to have different clauses for the U.S. than it does for Germany. It's easy to give GRIT different variants of the same message to use for different languages:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;messages\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"10240\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang !\u003d 'de'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_TERMS_OF_USE\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003edesc\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"Do not translate this message into German\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      Use this product at your own risk.\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'de'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_TERMS_OF_USE\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003edesc\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"This message only needs to be translated into German\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      Use this product at your own risk, except as limited by German law.\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- Other parts of .grd file snipped --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThere are a couple of things to note here:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eIt's a good idea to use the 'desc' field (as done in the example above) to let the translators know if a message only needs to be translated into a particular language, or into all languages except some particular language(s).\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eYou are providing a different \u003cstrong\u003eEnglish\u003c/strong\u003e message to use for a particular language (German in this case) but what actually gets output to the German RC file is the German translation of that English message.\u003c/li\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Getting_Translations_of_Strings_in_Images\" /\u003eGetting Translations of Strings in Images\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eYou may have a bunch of images that contain some text, and wouldn't it be nice to be able to get that text translated along with everything else? You can do this by following this recipe:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;includes\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1024\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"GIF\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDR_SUBMIT_BUTTON\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"submit_btn.gif\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/includes\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"False\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_MESSAGE_FOR_PICTURE_IDR_SUBMIT_BUTTON\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      Submit\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe trick here is to match the message with the include by using a simple naming convention (the message node's 'name' is the include node's 'name' with \"IDM_MESSAGE_FOR_PICTURE\u003ci\u003e\" prefixed), and to prevent the message from getting included in your executable by putting it into an \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;if expr\u003d\"False\"\u0026gt;\u003c/tt\u003e block (keep in mind that \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;if\u0026gt;\u003c/tt\u003e blocks only affect output of resources to \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files, and not to .xmb files or other translation interchange formats GRIT may support in the future).\u003c/i\u003e\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eAfter the translators have finished their job, you'll be able to find your image's translated text in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xtb\u003c/tt\u003e file for the language(s) in question.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Translate_by_Example\" /\u003eTranslate by Example\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn some cases, we have resources that difficult for a non-programmer to translate. An example is a date picture string, which might look like \"M'/'d YYYY\". A useful thing to do here is to get the translator to translate an example of what the result of applying that format string might look like. Then as a programmer you can take the translated example and translate it back into a picture string. The recipe for this would be:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;messages\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1024\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"False\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_DATE_FORMAT_EXAMPLE_TO_TRANSLATE\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      6/6 2005\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etranslateable\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_DATE_FORMAT\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    M'/'d YYYY\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eHere we add a message IDM_DATE_FORMAT_EXAMPLE_TO_TRANSLATE that gets sent for translation, but not added to your executable (because it's enclosed in an if-false block). The real resource is marked non-translatable, so it doesn't get sent for translation. Once the translators are done, you look for the message in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xtb\u003c/tt\u003e file, interpret the examples back into picture strings, and add them to your \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file using conditional output to control which one gets used for which language:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;messages\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efirst_id\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"1024\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"False\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_DATE_FORMAT_EXAMPLE_TO_TRANSLATE\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      9/23 2005\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'en'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etranslateable\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_DATE_FORMAT\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      M'/'d YYYY\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;if\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpr\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"lang \u003d\u003d 'fr'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;message\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etranslateable\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"IDM_DATE_FORMAT\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003einternal_comment\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"Translation of example was '23/09 2005'\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      dd'/'MM YYYY\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e  \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/if\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/messages\u0026gt;\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e\u0026lt;!-- ... --\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Miscellaneous_GRIT_extensions_and_tips\" /\u003eMiscellaneous GRIT extensions and tips\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGRIT has several other features you can use to help with localization.\u003c/p\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Using_expandable_variable_to_localize_the_link_in_html_files\" /\u003eUsing expandable variable to localize the link in html files\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn html files, it is common that the ref link needs to point to the localized page, for example,\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan\u003ehttp\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e:\u003c/span\u003e\u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e//www.example.com/support/myproduct?lang\u003d{language}\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn order for the link to point to the correct language, when GRIT is generating the localized html files from the html template, we set the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003elang\u003c/tt\u003eparameter to an expandable GRIT variable GRITLANGCODE\u003ca href\u003d\"https://code.google.com/p/grit-i18n/w/edit/GRITLANGCODE\" style\u003d\"color:rgb(0,0,204)\"\u003e?\u003c/a\u003e, so that it will be expanded to the correct langauge code.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn a struct node, enable the HTML template to use expandable variable by setting \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eexpand_variables\u003c/tt\u003e attribute to \"true\". Here is an example.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structure\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"AFINTRO.HTML\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eencoding\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"utf-8\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"afintro.html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"tr_html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003egenerateid\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpand_variables\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"true\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn the html template, set the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003elang\u003c/tt\u003e parameter of the link to GRITLANGCODE\u003ca href\u003d\"https://code.google.com/p/grit-i18n/w/edit/GRITLANGCODE\" style\u003d\"color:rgb(0,0,204)\"\u003e?\u003c/a\u003e. Here is an example.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;a\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ehref\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"http://www.example.com/support/myproduct?lang\u003d[GRITLANGCODE]\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etarget\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"_blank\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003cspan\u003eGo to site\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;/a\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Using_expandable_variable_to_generate_HTML_files_for_RTL_languag\" /\u003eUsing expandable variable to generate HTML files for RTL languages\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eTo enable GRIT to generate right-to-left (RTL) layout HTML files for RTL languages, we can use the special expandable variable GRITDIR\u003ca href\u003d\"https://code.google.com/p/grit-i18n/w/edit/GRITDIR\" style\u003d\"color:rgb(0,0,204)\"\u003e?\u003c/a\u003e.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn struct node, enable the HTML template to use expandable variables by setting the expand_variables attribute to \"true\".\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structure\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"AFINTRO.HTML\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eencoding\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"utf-8\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"afintro.html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"tr_html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003egenerateid\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"false\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eexpand_variables\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"true\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn the HTML template, embed GRITDIR\u003ca href\u003d\"https://code.google.com/p/grit-i18n/w/edit/GRITDIR\" style\u003d\"color:rgb(0,0,204)\"\u003e?\u003c/a\u003e variable in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;html\u0026gt;\u003c/tt\u003e tag, here is an example.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;html\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003estyle\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003ewidth\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e:\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,102,102)\"\u003e29em\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e;\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eheight\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e:\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,102,102)\"\u003e24em\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eXMLNS:t\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"urn:schemas-microsoft-com:time\"\u003c/span\u003e\u003cspan\u003e [\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eGRITDIR\u003c/span\u003e\u003cspan\u003e]\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Using_expandable_variable_to_set_the_language_attribute_in_produ\" /\u003eUsing expandable variable to set the language attribute in product version information correctly in VS_VERSION_INFO of rc file\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eIn order to have Language attribute of product version information show the correct language information for client application, the VS_VERSION_INFO section has to set the attributes using correct LCID and charset code. Again, we can use grit expandable variables to make life easier. Here is an example.\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan\u003eVS_VERSION_INFO VERSIONINFO\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e...\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eBEGIN\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    BLOCK \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"StringFileInfo\"\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eBEGIN\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e      BLOCK \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"[GRITVERLANGCHARSETHEX]\"\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eBEGIN\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e...\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eEND\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eEND\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    BLOCK \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"VarFileInfo\"\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eBEGIN\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e        VALUE \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"Translation\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e,\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e[\u003c/span\u003e\u003cspan\u003eGRITVERLANGID\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e],\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e[\u003c/span\u003e\u003cspan\u003eGRITVERCHARSETID\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e]\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eEND\u003c/span\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eEND\u003c/span\u003e\u003c/pre\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Running_processing_after_translation_of_structures\" /\u003eRunning processing after translation of structures\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eSometimes, it may be necessary to run additional processing of a translated file (\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003estructure\u003c/tt\u003e) after translation has occurred. To do this, use the\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003erun_command\u003c/tt\u003e attribute on the structure element. To add the filename to the command, use \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e%(filename)s\u003c/tt\u003e. For instance, to run \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003etype\u003c/tt\u003e on a file after it's been processed by grit, do:\u003c/p\u003e\u003cpre style\u003d\"font-size:12.2016000747681px;padding:0.5em;overflow:auto;font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;max-width:70em;background-color:rgb(238,238,238)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e\u0026lt;structure\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003ename\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"AFINTRO.HTML\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003eencoding\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"utf-8\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003efile\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"afintro.html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003etype\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"tr_html\"\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,0,102)\"\u003erun_command\u003c/span\u003e\u003cspan style\u003d\"color:rgb(102,102,0)\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,136,0)\"\u003e\"type %(filename)s\"\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Migrating_Your_Project\" /\u003eMigrating Your Project\u003c/h1\u003e\u003ch2 style\u003d\"font-size:large;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Converting_Your_RC_File_to_GRIT_Format\" /\u003eConverting Your RC File to GRIT Format\u003c/h2\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit rc2grd\u003c/tt\u003e tool takes an existing RC file, which should be the RC file for the source language, and converts it into a .grd file.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eBecause of the way \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit rc2grd\u003c/tt\u003e works, a bit of preparation of the original RC file is required.\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit rc2grd\u003c/tt\u003e takes any existing comments on your string table messages and uses them as the description field for the message.\u003c/li\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eThe description field for a message is output as a 'description' attribute to the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xmb\u003c/tt\u003e file for your project, so that it can be shown to translators when they are translating the message. There is a separate field in .grd files, \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003einternal_comment\u003c/tt\u003e, that can be used for comments about messages that are intended only for programmers, not for translators.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eComments belonging to a message are identified as all comments above that message after the last message parsed. This means if you use a commenting style where comments are immediately behind the message, you need to move them up above the message.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eIn your .rc file, you might have used a single comment for a whole block of messages. If you want this comment to be seen by translators when they edit any of these messages, you need to duplicate it to each of the messages instead of having it only at the start of the block.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eWhen you open up the .grd file, you will notice that some of your stringtable messages have been changed so that HTML code and \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eprintf\u003c/tt\u003e or\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eFormatMessage\u003c/tt\u003e format specifiers have been replaced with placeholders (\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e nodes). For all placeholders that were put in place of \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eprintf\u003c/tt\u003e and\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003eFormatMessage\u003c/tt\u003e format specifiers, the placeholder name starts as TODO_XXXX and the example is set to TODO. This allows you to go through the generated .grd file and replace the TODO_XXXX placeholder names with sensible names (ones that will help the translators) and the example text with an actual example of what might be put in place of this placeholder (for instance if the placeholder name is NUMBER then the example might just be \"5\").\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe .grd file that gets generated will refer to your original .rc file for any menus, dialogs and version information resources. You can continue using e.g. the VisualStudio\u003ca href\u003d\"https://code.google.com/p/grit-i18n/w/edit/VisualStudio\" style\u003d\"color:rgb(0,0,204)\"\u003e?\u003c/a\u003e resource editor to edit these resources in the original .rc file. However, once you've started building your project using the .rc file generated from the .grd file by \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit build\u003c/tt\u003e, you should delete stringtables and \"includes\" from your original .rc file as these should now be in the .grd file and you don't want people to get confused and edit them in the old location.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eNote that the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit rc2grd\u003c/tt\u003e tool only supports symbolic resource IDs and will not transfer resources that are identified by string literals over to the .grd file. It is recommended not to use string literals as resource IDs.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5837297656848244278"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/tools-we-use-in-chromium/grit/grit-users-guide"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/94741134965390265"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/94741134965390265"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/94741134965390265"}],"author":[{"name":{"$t":"Jói Sigurðsson"},"email":{"$t":"joi@chromium.org"}}],"sites$pageName":{"$t":"grit-users-guide"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"UCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2480943774340680129"},"published":{"$t":"2008-08-29T02:06:59.179Z"},"updated":{"$t":"2018-12-05T20:52:17.237Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-12-05T20:52:15.012Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Bug Life Cycle and Reporting Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Important-links\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eImportant links\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-the-web-browser-\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eChromium (the web browser)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-OS-the-operating-system-\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eChromium OS (the operating system)\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bug-reporting-guidelines\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBug reporting guidelines\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Release-block-guidelines\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eRelease block guidelines\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Triage-guidelines\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eTriage guidelines\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Labels\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eLabels\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Status\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eStatus\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Open-bugs\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eOpen bugs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Closed-bugs\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eClosed bugs\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bug-life-cycle\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eBug life cycle\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Deciding-where-to-submit-your-bug\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eDeciding where to submit your bug\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Helping-with-bug-triage\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eHelping with bug triage\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e \r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Important-links\" /\u003eImportant links\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Chromium-the-web-browser-\" /\u003eChromium (the web browser)\u003c/h3\u003e\r\n\r\n\u003cul\u003e\r\n\u003cli\u003e Report bugs at \u003ca href\u003d\"https://crbug.com/wizard\"\u003ehttps://crbug.com/wizard\u003c/a\u003e\u003cbr /\u003e\r\n\u003c/li\u003e\u003cli\u003eSpecifically:\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidlines-for-the-mac-linux-builds\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\"\u003eBug Reporting Guidelines for the Mac \u0026amp; Linux builds\u003c/a\u003e (with links to known issues pages)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/reporting-crash-bug\"\u003eInstructions for reporting crashes\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e View existing bugs at \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list\"\u003ehttps://bugs.chromium.org/p/chromium/issues/list\u003c/a\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Chromium-OS-the-operating-system-\" /\u003eChromium OS (the operating system)\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003e Report bugs at \u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry?template\u003dDefect%20on%20Chrome%20OS\"\u003ehttps://code.google.com/p/chromium/issues/entry?template\u003dDefect%20on%20Chrome%20OS\u003c/a\u003e\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e View existing bugs at \u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dos%3Dchrome\"\u003eChromium OS issues\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\nYou need a \u003ca href\u003d\"https://www.google.com/accounts/NewAccount\"\u003eGoogle Account\u003c/a\u003e associated with your email address in order to use the bug system.\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bug-reporting-guidelines\" /\u003eBug reporting guidelines\u003c/h2\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eIf you're a web developer, see \u003ca href\u003d\"https://developers.google.com/web/feedback/file-a-bug\"\u003eHow to file a good bug\u003c/a\u003e\u003c/li\u003e\u003cli\u003eMake sure the bug is verified with the latest Chromium (or Chrome canary) build. \u003c/li\u003e\u003cli\u003eIf it's one of the following bug types, please provide some further information:\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003eWeb site compatibility problem:\u003c/b\u003e Please provide a URL to replicate the issue.\u003c/li\u003e\u003cli\u003e\u003cb\u003eHanging tab: \u003cspan style\u003d\"font-weight:normal\"\u003eSee\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/hanging-tabs\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eReporting hanging tab bugs\u003c/a\u003e.\u003c/span\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003eCrash: \u003cspan style\u003d\"font-weight:normal\"\u003eSee\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/reporting-crash-bug\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eReporting crash bugs\u003c/a\u003e.\u003c/span\u003e\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eProvide a high-level problem description.\u003c/li\u003e\r\n\u003cli\u003eMention detailed steps to replicate the issue.\u003c/li\u003e\r\n\u003cli\u003eInclude the expected behavior.\u003c/li\u003e\r\n\u003cli\u003eVerify the bug in other browsers and provide the information.\u003c/li\u003e\r\n\u003cli\u003eInclude screenshots, if they might help.\u003c/li\u003e\r\n\u003cli\u003eIf a bug can be \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:47b7501e05b5377c\" class\u003d\"disabled\"\u003ereduced to a simplified test\u003c/a\u003e, then create a simplified test and attach it to the bug.\u003c/li\u003e\r\n\u003cli\u003eAdditional \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidlines-for-the-mac-linux-builds\" style\u003d\"color:rgb(0,102,204);outline-style:none\" target\u003d\"_blank\"\u003eBug Reporting Guidlines for the Mac \u0026amp; Linux builds\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eAdditional Guidelines for \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/reporting-security-bugs\"\u003eReporting Security Bugs\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Release-block-guidelines\" /\u003eRelease block guidelines\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/issue-tracking/release-block-guidelines\"\u003eRelease Block Guidelines\u003c/a\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Triage-guidelines\" /\u003eTriage guidelines\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/triage-best-practices\"\u003eTriage Best Practices\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Labels\" /\u003eLabels\u003cbr /\u003e\r\n\t\u003c/h2\u003e\r\n\u003cp\u003eLabels are used to help the engineering team categorize and prioritize the bug reports that are coming in. Each report can (and should) have multiple labels.\u003c/p\u003e\r\n\u003cp\u003eFor details on labels used by the Chromium project, see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/chromium-bug-labels\"\u003eChromium Bug Labels\u003c/a\u003e.\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Status\" /\u003eStatus\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Open-bugs\" /\u003eOpen bugs\u003c/h3\u003e\r\n\u003ctable border\u003d\"1\" cellpadding\u003d\"5\" cellspacing\u003d\"0\" width\u003d\"50%\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003cth\u003eStatus value\u003c/th\u003e\r\n\t\r\n\u003cth\u003eDescription\u003c/th\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003ctd\u003eUnconfirmed\u003c/td\u003e\r\n\t\r\n\u003ctd\u003eThe default for public bugs. Waiting for someone to validate, \r\nreproduce, or otherwise confirm that this is a bug.\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003ctd\u003eUntriaged\u003c/td\u003e\r\n\t\r\n\u003ctd\u003eA confirmed bug that has not been reviewed for priority or assignment. This is the default for project members' new bugs.\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003ctd\u003eAvailable\u003c/td\u003e\r\n\t\r\n\u003ctd\u003eConfirmed and triaged, but not assigned. Feel free to take these bugs!\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003ctd\u003eAssigned\u003c/td\u003e\r\n\t\r\n\u003ctd\u003eIn someone's work queue.\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\t\r\n\u003ctd\u003eStarted\u003c/td\u003e\r\n\t\r\n\u003ctd\u003eActively being worked on.\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Closed-bugs\" /\u003eClosed bugs\u003c/h3\u003e\r\n\u003ctable border\u003d\"1\" cellpadding\u003d\"5\" cellspacing\u003d\"0\" width\u003d\"50%\"\u003e\r\n\t\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\t\t\r\n\u003cth\u003eStatus value\u003c/th\u003e\r\n\t\t\r\n\u003cth\u003eDescription\u003c/th\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eFixed\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eFixed.\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eVerified\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eThe fix has been verified by test or by the original reporter.\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eDuplicate\u003c/td\u003e\u003ctd\u003e\u003cp\u003eThis issue has been reported in another bug, or shares the same root cause as another bug. When Duplicate is selected, a field will appear for the ID of the other bug --- be sure to fill this in.\u003c/p\u003e\u003cp\u003eMark the bug with less information/discussion in it as the Duplicate.\u003c/p\u003e\r\n\t\t\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eWontFix\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eCovers all the reasons we chose to close the bug without taking action (can't repro, working as intended, obsolete).\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eExternalDependency\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eBugs that turn out to be in another project's code and that we've filed with that other project. Useful for tracking known issues that manifest themselves in our product, but that need to be fixed elsewhere (such as WebKit and V8 issues).\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eFixUnreleased\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eA special state for security hotfixes to mark bugs that are fixed, but not yet delivered to users. Bugs with this status will be visible only to project members and the original reporter.\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\r\n\u003ctr\u003e\r\n\t\t\r\n\u003ctd\u003eInvalid\u003c/td\u003e\r\n\t\t\r\n\u003ctd\u003eIllegible, spam, etc.\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bug-life-cycle\" /\u003eBug life cycle\u003c/h2\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eWhen a bug is first logged, it is given \u003cb\u003eUnconfirmed\u003c/b\u003e status.\u003c/li\u003e\r\n\u003cli\u003eThe status is changed from unconfirmed to \u003cspan style\u003d\"font-weight:bold\"\u003eUntriaged \u003c/span\u003eonce it has been verified as a Chromium bug.\u003c/li\u003e\u003cul\u003e\r\n\u003c/ul\u003e\r\n\u003cli\u003eOnce a bug has been picked up by a developer, it is marked as \u003cspan style\u003d\"font-weight:bold\"\u003eAssigned\u003c/span\u003e.\u003c/li\u003e\r\n\u003cli\u003eA status of \u003cb\u003eStarted\u003c/b\u003e means a fix is being worked on.\u003c/li\u003e\u003cli\u003eA status of \u003cb\u003eFixed\u003c/b\u003e means that the bug has been fixed, and \u003cb\u003eVerified\u003c/b\u003e means that the fix has been tested and confirmed. Please note that it will take some time for the \"fix\" to make it into the various channels (canary, beta, release) - pay attention to the milestone attached to the bug, and compare it to chrome://version.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Deciding-where-to-submit-your-bug\" /\u003eDeciding where to submit your bug\u003c/h2\u003e\r\n\u003cdiv\u003eUsually, Chromium-related bugs should be filed under one of the following projects:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry\"\u003echromium\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://crbug.com/\"\u003eblink\u003c/a\u003e and add component \"Blink\"\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Helping-with-bug-triage\" /\u003e\u003cfont size\u003d\"4\"\u003eHelping with bug triage\u003c/font\u003e\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003eRead \u003ca href\u003d\"http://www.chromium.org/getting-involved/bug-triage\"\u003ehttp://www.chromium.org/getting-involved/bug-triage\u003c/a\u003e if you're interested in helping with bug triage.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eInfrastructure and build tools\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13px;font-weight:normal\"\u003eIf you find an issue with our infrastructure or build tools, please file the ticket using the Build Infrastructure template:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry?template\u003dBuild%20Infrastructure\"\u003ehttps://code.google.com/p/chromium/issues/entry?template\u003dBuild%20Infrastructure\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3087306851372487833"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2480943774340680129"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2480943774340680129"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2480943774340680129"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"bug-reporting-guidelines"},"sites$revision":{"$t":"39"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8577293762466964669"},"published":{"$t":"2018-12-03T23:03:58.037Z"},"updated":{"$t":"2018-12-03T23:03:58.074Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-12-03T23:03:58.037Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ServoV4.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8577293762466964669"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2216022535313284907"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/for-testers/faft/ServoV4.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8577293762466964669"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8577293762466964669"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8577293762466964669"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8577293762466964669"}],"author":[{"name":{"$t":"Ashakiran Byrappa"},"email":{"$t":"abyrappa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7141863382260375837"},"published":{"$t":"2018-12-03T22:50:34.173Z"},"updated":{"$t":"2018-12-03T22:50:34.197Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-12-03T22:50:34.173Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"FAFT (1).jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7141863382260375837"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2216022535313284907"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/for-testers/faft/FAFT%20(1).jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7141863382260375837"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7141863382260375837"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7141863382260375837"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7141863382260375837"}],"author":[{"name":{"$t":"Ashakiran Byrappa"},"email":{"$t":"abyrappa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3099386173909262880"},"published":{"$t":"2018-12-03T22:43:11.743Z"},"updated":{"$t":"2018-12-03T22:43:11.772Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-12-03T22:43:11.743Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"servo_v4.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3099386173909262880"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2216022535313284907"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/for-testers/faft/servo_v4.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3099386173909262880"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3099386173909262880"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3099386173909262880"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3099386173909262880"}],"author":[{"name":{"$t":"Ashakiran Byrappa"},"email":{"$t":"abyrappa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9207956454205601387"},"published":{"$t":"2013-10-23T23:29:07.801Z"},"updated":{"$t":"2018-12-03T16:58:40.536Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2017-06-28T15:55:59.002Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Performance Try Bots"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Latest-docs-are-at:-https:-chromium.googlesource.com-chromium-src-master-docs-speed-perf_trybots.md\" /\u003e\u003cfont size\u003d\"2\" style\u003d\"font-weight:normal\"\u003eLatest docs are at: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/speed/perf_trybots.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/speed/perf_trybots.md\u003c/a\u003e\u003c/font\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4695032730150632508"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/telemetry/performance-try-bots"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9207956454205601387"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9207956454205601387"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9207956454205601387"}],"author":[{"name":{"$t":"Simon Hatch"},"email":{"$t":"simonhatch@chromium.org"}}],"sites$pageName":{"$t":"performance-try-bots"},"sites$revision":{"$t":"21"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/531926969765487671"},"published":{"$t":"2018-01-03T22:36:49.264Z"},"updated":{"$t":"2018-11-29T23:16:22.153Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-29T23:16:20.174Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mitigating Side-Channel Attacks"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eAt the beginning of 2018, researchers from Google's \u003c/span\u003e\u003ca href\u003d\"https://googleprojectzero.blogspot.com/2014/07/announcing-project-zero.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eProject Zero\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003edisclosed\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e a series of new attack techniques against speculative execution optimizations used by modern CPUs. Security researchers will continue to find new variations of these and other side-channel attacks. Such techniques have implications for products and services that execute third-party code, including Chrome and other browsers with support for features like JavaScript and WebAssembly.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eThe Chrome Security Team has written \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/side-channel-threat-model.md\"\u003ea document covering the variety of defense techniques available\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:rgb(255,255,255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eProtecting users with Site Isolation\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome has been working on a feature called \u003c/span\u003e\u003ca href\u003d\"https://www.chromium.org/Home/chromium-security/site-isolation\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eSite Isolation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e which provides extensive mitigation against exploitation of these types of vulnerabilities. With Site Isolation enabled, the amount of data exposed to side-channel attacks is reduced as Chrome renders content for each website in a separate process. This allows websites to be protected from each other by the security guarantees provided by the operating system on which Chrome is running.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSite Isolation is enabled by default on Windows, Mac, Linux, and Chrome OS since Chrome \u003c/span\u003e\u003cspan style\u003d\"color:rgba(0,0,0,0.87);font-family:Roboto,sans-serif;font-size:17px;background-color:transparent\"\u003e67\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, and can also can be controlled \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/chrome/a/answer/7581529\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003evia enterprise policies\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/chrome/answer/7623121\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ewith chrome://flags\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. More details can be found in our blog post \u003ca href\u003d\"https://security.googleblog.com/2018/07/mitigating-spectre-with-site-isolation.html\"\u003eMitigating Spectre with Site Isolation in Chrome\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003cspan\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSite Isolation is most effective when website developers follow modern security best practices:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eWhere possible cookies should use \u003c/span\u003e\u003ca href\u003d\"https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02#section-5.3.7\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSameSite\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and\u003c/span\u003e\u003ca href\u003d\"https://www.owasp.org/index.php/HttpOnly\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e HTTPOnly\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e attributes and pages should avoid reading from \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003edocument.cookie\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:10pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eMake sure \u003c/span\u003e\u003ca href\u003d\"https://www.chromium.org/Home/chromium-security/site-isolation#TOC-Recommendations-for-Web-Developers\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eMIME types are correct\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and specify an \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eX-Content-Type-Options: nosniff\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e response header for any URLs with user-specific or sensitive content, to take full advantage of \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eCross-Origin Read Blocking\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e (CORB).\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eWeb developers should also see the \u003c/span\u003e\u003ca href\u003d\"https://developers.google.com/web/updates/2018/02/meltdown-spectre\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eMeltdown/Spectre WebFundamentals\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e post.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.999999999999998pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSpectre and Meltdown\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eThe attacks known as \u003c/span\u003e\u003ca href\u003d\"https://meltdownattack.com/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSpectre and Meltdown\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e, originally \u003c/span\u003e\u003ca href\u003d\"https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003edisclosed\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e by Project Zero, have implications for Chrome. For information about other Google products and services, including Chrome OS please see the \u003c/span\u003e\u003ca href\u003d\"https://security.googleblog.com/2018/01/todays-cpu-vulnerability-what-you-need.html\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eGoogle Online Security Blog\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eThese attacks are mitigated by Site Isolation. Additionally, staring in Chrome 64, Chrome's JavaScript engine \u003c/span\u003e\u003ca href\u003d\"https://www.v8project.org/\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eV8\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e has included \u003c/span\u003e\u003ca href\u003d\"https://github.com/v8/v8/wiki/Untrusted-code-mitigations\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003efurther mitigations\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e which provide protection on platforms where Site Isolation is not enabled.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eIn line with \u003c/span\u003e\u003ca href\u003d\"https://blog.mozilla.org/security/2018/01/03/mitigations-landing-new-class-timing-attack/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eother\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://blogs.windows.com/msedgedev/2018/01/03/speculative-execution-mitigations-microsoft-edge-internet-explorer/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003ebrowsers'\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e response to Spectre and Meltdown, Chrome disabled\u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSharedArrayBuffer\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e in Chrome 63 starting on Jan 5th 2018, and modified the behavior of other APIs such as \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eperformance.now\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e to help reduce the efficacy of side-channel attacks. \u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSharedArrayBuffer\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e is now re-enabled in Chrome versions where Site Isolation is on by default.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.999999999999998pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eGLitch\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eResearchers from Vrije Universiteit Amsterdam disclosed \u003c/span\u003e\u003ca href\u003d\"https://www.vusec.net/wp-content/uploads/2018/05/glitch.pdf\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003edetails\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e of the GLitch attack. Part of the attack uses high-precision GPU timers available in WebGL to obtain information that is then used to perform a \u003c/span\u003e\u003ca href\u003d\"https://en.wikipedia.org/wiki/Row_hammer\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eRowhammer-style\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e bit-flip attack.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eStarting in Chrome 65, the \u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/API/EXT_disjoint_timer_query\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eEXT_disjoint_timer_query\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eEXT_disjoint_timer_query_webgl2\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e WebGL extensions have been disabled, and the behaviour of \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eclientWaitSync\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and other \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e*Sync\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e functions has been changed to reduce their effective precision as clocks.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eAlthough the GLitch attack is unrelated to Spectre and Meltdown, \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eEXT_disjoint_timer_query\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Courier New;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eEXT_disjoint_timer_query_webgl2\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e could also be used to mount Spectre and Meltdown attacks. Accordingly, they will remain disabled in Chrome until Site Isolation is on by default, at which point they will be re-enabled with sufficiently reduced precision to mitigate GLitch attacks.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eAlso see \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/glitch-vulnerability-status\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#1155cc;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003emore details\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:#000000;background-color:#ffffff;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e about GLitch and Chrome OS.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003c/p\u003e\r\n\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/ssca"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/531926969765487671"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/531926969765487671"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/531926969765487671"}],"author":[{"name":{"$t":"Andrew Whalley"},"email":{"$t":"awhalley@chromium.org"}}],"sites$pageName":{"$t":"ssca"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"KXsmYD1aFQ..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/224672608071467632"},"published":{"$t":"2013-04-09T18:01:33.515Z"},"updated":{"$t":"2018-11-28T03:47:37.022Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-28T03:47:34.928Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Web IDL in Blink"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv /\u003e\r\n\u003cdiv\u003e\u003ci\u003eBlink developers (non-bindings development): for general IDL use, see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/web-idl-interfaces\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeb IDL interfaces\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e; for configuring bindings, s\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eee \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/blink/webidl/blink-idl-extended-attributes\"\u003eBlink IDL Extended Attributes\u003c/a\u003e; for IDL dictionaries use, see \u003ca href\u003d\"https://docs.google.com/document/d/1mRB5zbfHd0lX2Y_Hr7g6grzP_L4Xc6_gBRjL-AE7sY8/edit?usp\u003dsharing\"\u003eIDL dictionaries in Blink\u003c/a\u003e.\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Basics-of-IDL\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBasics of IDL\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Syntax\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSyntax\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Semantics\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eSemantics\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Types\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eTypes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-undefined-and-null\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eundefined and null\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Function-resolution\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eFunction resolution\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-File-organization\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eFile organization\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Dependencies\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eDependencies\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-IDL-extended-attribute-validator\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eIDL extended attribute validator\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Tests\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eTests\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Reference-tests-run-bindings-tests-\"\u003e\u003cstrong\u003e7.1 \u003c/strong\u003eReference tests (run-bindings-tests)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Behavior-tests\"\u003e\u003cstrong\u003e7.2 \u003c/strong\u003eBehavior tests\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-is-the-bindings-code-generated-\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eWhere is the bindings code generated?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Limitations-and-improvements\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eLimitations and improvements\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Syntax-error-causes-infinite-loop\"\u003e\u003cstrong\u003e9.1 \u003c/strong\u003eSyntax error causes infinite loop\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Type-checking\"\u003e\u003cstrong\u003e9.2 \u003c/strong\u003eType checking\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bindings-development\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eBindings development\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mailing-List\"\u003e\u003cstrong\u003e10.1 \u003c/strong\u003eMailing List\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-If-working-on-bindings-you-likely-wish-to-join-the-blink-reviews-bindings-mailing-list.\"\u003e\u003cstrong\u003e11 \u003c/strong\u003eIf working on bindings, you likely wish to join the blink-reviews-bindings mailing list.\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-See-also\"\u003e\u003cstrong\u003e11.1 \u003c/strong\u003eSee also\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\r\n\u003cp\u003e\u003ca href\u003d\"https://heycam.github.io/webidl/\" rel\u003d\"nofollow\"\u003e\u200bWeb IDL\u003c/a\u003e is a language that defines how Blink interfaces are bound to V8. You need to write IDL files (e.g. xml_http_request.idl, element.idl, etc) to expose Blink interfaces to those external languages. When Blink is built, the IDL files are parsed, and the code to bind Blink implementations to V8 interfaces automatically generated.\u003c/p\u003e\r\n\r\n\u003cp\u003eThis document describes practical information about how the IDL bindings work and how you can write IDL files in Blink. The syntax of IDL files is fairly well documented in the \u003ca href\u003d\"https://heycam.github.io/webidl/\" rel\u003d\"nofollow\"\u003e\u200bWeb IDL spec\u003c/a\u003e, but it is too formal to read :-) and there are several differences between the Web IDL spec and the Blink IDL due to implementation issues. For design docs on bindings generation, see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/idl-build\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eIDL build\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLCompiler.md\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eIDL compiler\u003c/a\u003e.\u003c/p\u003e\r\n\u003cp\u003eFor Blink developers, the main details of IDLs are the extended attributes, which control implementation-specific behavior: s\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eee \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\"\u003eBlink IDL Extended Attributes\u003c/a\u003e for extensive details.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003eOur goal is to converge Blink's IDL and Web IDL. The grammar is almost identical; see below.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Basics-of-IDL\" /\u003eBasics of IDL\u003c/h2\u003e\r\n\u003cp\u003eHere is an example of IDL files:\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e[CustomToV8]\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003einterface Node {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    const unsigned short ELEMENT_NODE \u003d 1;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    attribute Node parentNode;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    [TreatReturnedNullStringAs\u003dNull] attribute DOMString nodeName;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    [Custom] Node appendChild(Node newChild);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eLet us introduce some terms:\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eThe above IDL file describes the \u003ccode\u003eNode\u003c/code\u003e \u003cb\u003einterface\u003c/b\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003eELEMENT_NODE\u003c/code\u003e is a \u003cb\u003econstant\u003c/b\u003e of the \u003ccode\u003eNode\u003c/code\u003e interface.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003eparentNode\u003c/code\u003e and \u003ccode\u003enodeName\u003c/code\u003e are \u003cb\u003eattributes\u003c/b\u003e of the \u003ccode\u003eNode\u003c/code\u003e interface.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003eappendChild(...)\u003c/code\u003e and \u003ccode\u003eaddEventListener(...)\u003c/code\u003e are \u003cb\u003eoperations\u003c/b\u003e of the \u003ccode\u003eNode\u003c/code\u003e interface.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003etype\u003c/code\u003e, \u003ccode\u003elistener\u003c/code\u003e and \u003ccode\u003euseCapture\u003c/code\u003e are \u003cb\u003earguments\u003c/b\u003e of the \u003ccode\u003eaddEventListener\u003c/code\u003e operation.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003e[CustomToV8]\u003c/code\u003e, \u003ccode\u003e[TreatReturnedNullStringAs\u003dNull]\u003c/code\u003e and \u003ccode\u003e[Custom]\u003c/code\u003e are \u003cb\u003eextended attributes\u003c/b\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThe key points are as follows:\u003c/span\u003e\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eAn IDL file controls how the bindings code between JavaScript engine and the Blink implementation is generated.\u003c/li\u003e\r\n\u003cli\u003eExtended attributes enable you to control the bindings code more in detail.\u003c/li\u003e\r\n\u003cli\u003eThere are ~60 extended attributes, explained in \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\"\u003ea separate page\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eExtended attributes can be specified on interfaces, methods, attributes, arguments, and types (but not constants, enums, etc.).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eThe valid extended attributes depend on where they attach: interfaces and methods have different extended attributes.\u003c/p\u003e\r\n\u003cp\u003eA simple IDL file template looks like:\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003einterface INTERFACE_NAME {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    const unsigned long value \u003d 12345;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    attribute Node node;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    void func(long argument, ...);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\u003cp\u003eWith extended attributes, this looks like:\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e[\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    EXTATTR,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    EXTATTR,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    ...,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e] \u003c/code\u003e\u003ccode\u003einterface INTERFACE_NAME {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    const unsigned long value \u003d 12345;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    [EXTATTR, EXTATTR, ...] attribute Node node;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    [EXTATTR, EXTATTR, ...] void func([EXTATTR, EXTATTR, ...] optional [EXTATTR] long argument, ...);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Syntax\" /\u003eSyntax\u003c/h2\u003e\r\n\u003cp\u003eBlink IDL is a dialect of Web IDL. The lexical syntax is identical, but the phrase syntax is slightly different.\u003c/p\u003e\r\n\u003cp\u003eImplementation-wise, the lexer and parser are written in \u003ca href\u003d\"http://www.dabeaz.com/ply/\" rel\u003d\"nofollow\"\u003ePLY\u003c/a\u003e (Python lex-yacc), an implementation of lex and yacc for Python. A standard-compliant lexer is used (Chromium \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/tools/idl_parser/idl_lexer.py\" style\u003d\"font-size:10pt\"\u003etools/idl_parser/idl_lexer.py\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e).\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e The parser\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e (Blink \u003c/span\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/scripts/blink_idl_parser.py\" style\u003d\"font-size:10pt\"\u003ebindings/scripts/blink_idl_parser.py\u003c/a\u003e) derives from a standard-compliant parser (Chromium \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/tools/idl_parser/idl_parser.py\" style\u003d\"font-size:10pt\"\u003etools/idl_parser/idl_parser.py\u003c/a\u003e).\u003c/p\u003e\r\n\u003cp\u003eBlink deviations from the Web IDL standard can be seen as the BNF production rules in the derived parser.\u003c/p\u003e\u003cp\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eStyle\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cdiv\u003eStyle guidelines are to generally follow \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/blink/coding-style\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eBlink style\u003c/a\u003e for C++, with a few points highlighted, addenda, and exceptions. These are not enforced by a pre-submit test, but do assist legibility:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eInclude the \u003ca href\u003d\"http://www.chromium.org/blink/coding-style#TOC-License\"\u003ecurrent Blink license header\u003c/a\u003e in new files\u003c/li\u003e\u003cli\u003eFor IDL based on standards/specifications:\u003c/li\u003e\u003cul\u003e\u003cli\u003eInclude a comment with the URL of the spec (and specific section, if possible) where the IDL is defined.\u003c/li\u003e\u003cli\u003eFollow any IDL samples given in specs.\u003c/li\u003e\u003cli\u003eKeep the order of interface and dictionary members the same as in the spec.\u003c/li\u003e\u003cli\u003eDocument any deviations from the spec with \u003ccode\u003e// TODO(name or bug link):\u003c/code\u003e comments\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e4-space indent.\u003c/li\u003e\r\n\u003cli\u003eAvoid line breaks, notably:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eKeeping extended attributes of members (attributes, constants, and operations) on the same line as the member.\u003c/li\u003e\r\n\u003cli\u003eGenerally keep argument lists of methods on the same line as the definition. Ok to break if it's v. long or for overloaded methods.\u003c/li\u003e\r\n\u003cli\u003eFor overloaded methods, it is ok to use line breaks to group arguments. E.g., if one method has arguments (a, b, c) and the other has arguments (a, b, c, d, e, f), it is ok to include a line break between c and d, to clarify the grouping.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eAlphabetize lists of extended attributes.\u003c/li\u003e\r\n\u003cli\u003eFor extended attributes on interface, put each on a separate line with a trailing comma, except for the last one. Note that this is \u003ci\u003enot\u003c/i\u003e style used in the standard, which uses a horizontal list on the line before the interface. Please omit the \u003ccode\u003e[]\u003c/code\u003e list if it's empty. Examples of Blink style:\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e[\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    A,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    B  /* No trailing commas on the last extended attribute */\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e] interface Foo {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    ...\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\r\n\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003einterface Bar {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    ...\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eNo spacing for horizontal alignment, except for lists of constants.\u003c/li\u003e\r\n\u003cli\u003eFor anonymous special operations, leave a space between the type and the parenthesize argument list; if you don't, the type looks like a function name!\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\u003ccode\u003egetter DOMString (unsigned long index); // Not: DOMString(unsigned long index) \u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cul\u003e\u003cli\u003eFor special operations, the (first) argument to indexed property operations should be called \u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eindex\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, and the (first) argument to named property operations should be called \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003ename\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e; the second argument in property setters should be called \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003evalue\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. For example:\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/span\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e// Indexed property operations \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003egetter DOMString (unsigned long index); \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetter DOMString (unsigned long index, DOMString value); \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003edeleter boolean (unsigned long index); \u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e \u003cbr /\u003e\u003ccode\u003e// Named property operations \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003egetter DOMString (DOMString name); \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetter DOMString (DOMString name, DOMString value); \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003edeleter boolean (DOMString name);\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Semantics\" /\u003eSemantics\u003c/h2\u003e\r\n\u003cdiv\u003eWeb IDL exposes an interface to JavaScript, which is implemented in C++. Thus its semantics bridge these two languages, though it is not identical to either. Web IDL's semantics are much closer to C++ than to JavaScript – in practice, it is a relatively thin abstraction layer over C++. Thus C++ implementations are quite close to the IDL spec, though the resulting interface is somewhat unnatural from a JavaScript perspective: it behaves differently from normal JavaScript libraries.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Types\" /\u003eTypes\u003c/h3\u003e\r\n\u003cdiv\u003e\u003ci\u003eSee: \u003ca href\u003d\"http://heycam.github.io/webidl/#idl-types\" rel\u003d\"nofollow\"\u003eWeb IDL types\u003c/a\u003e.\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003ca href\u003d\"http://heycam.github.io/webidl/#dfn-primitive-type\" rel\u003d\"nofollow\"\u003ePrimitive types\u003c/a\u003e in Web IDL are very close to fundamental types in C++ (booleans, characters, integers, and floats), though note that there is no \u003ccode\u003eint\u003c/code\u003e type in Web IDL (specs usually use \u003ccode\u003elong\u003c/code\u003e instead).\u003c/span\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-undefined-and-null\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eundefined and null\u003c/span\u003e\u003c/h3\u003e\r\n\u003cdiv\u003eJavaScript has two special values, \u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e, which are often confusing and do not fit easily into C++. Indeed, precise behavior of \u003ccode\u003eundefined\u003c/code\u003e in Web IDL has varied over time and is under discussion (\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003esee W3C Bug \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ca href\u003d\"https://www.w3.org/Bugs/Public/show_bug.cgi?id\u003d23532\" rel\u003d\"nofollow\"\u003e23532\u003c/a\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eDealing with undefined).\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eBehavior on \u003c/span\u003e\u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003cb\u003eMUST\u003c/b\u003e be tested in web tests, as these can be passed and are easy to get wrong. If these tests are omitted, there may be crashes (which will be caught by ClusterFuzz) or behavioral bugs (which will show up as web pages or JavaScript libraries breaking).\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor the purposes of Blink, behavior can be summarized as follows:\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e are valid values for \u003cb\u003ebasic types\u003c/b\u003e, and are automatically converted.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eConversion follows \u003ca href\u003d\"http://heycam.github.io/webidl/#dfn-convert-ecmascript-to-idl-value\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eECMAScript type mapping\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, which generally implements JavaScript \u003c/span\u003e\u003ca href\u003d\"https://tc39.github.io/ecma262/#sec-type-conversion\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eType Conversion\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, e.g. \u003c/span\u003e\u003ca href\u003d\"https://tc39.github.io/ecma262/#sec-toboolean\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eToBoolean\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://tc39.github.io/ecma262/#sec-tonumber\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eToNumber\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, \u003c/span\u003e\u003ca href\u003d\"https://tc39.github.io/ecma262/#sec-tostring\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eToString\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThey may be converted to different values, notably \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003e\"undefined\"\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e and \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003e\"null\"\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e for \u003ccode\u003eDOMString\u003c/code\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor numeric types, this can be affected by the extended attributes \u003ccode\u003e[Clamp]\u003c/code\u003e and \u003ccode\u003e[EnforceRange]\u003c/code\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e[Clamp]\u003c/code\u003e changes the value so that it is valid.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e[EnforceRange]\u003c/code\u003e throws a \u003ccode\u003eTypeError\u003c/code\u003e on these invalid values.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cli\u003efor \u003cb\u003einterface types\u003c/b\u003e, \u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e are both treated as \u003ccode\u003enull\u003c/code\u003e, which maps to \u003ccode\u003enullptr\u003c/code\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003efor nullable interface types, like \u003ccode\u003eNode?\u003c/code\u003e, \u003ccode\u003enull\u003c/code\u003e is a valid value, and thus \u003ccode\u003enullptr\u003c/code\u003e is passed to the C++ implementation\u003c/li\u003e\r\n\u003cli\u003efor non-nullable interface types, like \u003ccode\u003eNode\u003c/code\u003e (no \u003ccode\u003e?\u003c/code\u003e), \u003ccode\u003enull\u003c/code\u003e is \u003ci\u003enot\u003c/i\u003e a valid value, and a \u003ccode\u003eTypeError\u003c/code\u003e is thrown, as in JavaScript \u003ca href\u003d\"http://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject\" rel\u003d\"nofollow\"\u003eToObject\u003c/a\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ci style\u003d\"font-weight:bold\"\u003eHowever,\u003c/i\u003e this nullability check is \u003ci\u003enot\u003c/i\u003e done by default: it is only done if \u003ccode\u003e[LegacyInterfaceTypeChecking]\u003c/code\u003e is specified on the interface or member (see Bug \u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d249598\"\u003e249598\u003c/a\u003e: Throw TypeError when null is specified to non-nullable interface parameter)\u003c/li\u003e\r\n\u003cli\u003eThus if \u003ccode\u003e[LegacyInterfaceTypeChecking]\u003c/code\u003e is specified in the IDL, you do \u003ci\u003enot\u003c/i\u003e need to have a null check in the Blink implementation, as the bindings code already does this, but if \u003ccode\u003e[LegacyInterfaceTypeChecking]\u003c/code\u003e is not specified, you \u003ci\u003edo\u003c/i\u003e need to have a null check in the Blink implementation.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/ul\u003e\r\n\u003cli\u003efor \u003cb\u003edictionary types\u003c/b\u003e, \u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e both correspond to an empty dictionary\u003c/li\u003e\r\n\u003cli\u003efor \u003cb\u003eunion types\u003c/b\u003e, \u003ccode\u003eundefined\u003c/code\u003e and \u003ccode\u003enull\u003c/code\u003e are assigned to a type that can accept them, if possible: null, empty dictionary, or conversion to basic type\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003efunction resolution\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ccode\u003eundefined\u003c/code\u003e affects function resolution, both as an optional argument and for overloaded operations, basically being omitted if trailing (but some exceptions apply). This is complicated (\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003esee W3C Bug \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://www.w3.org/Bugs/Public/show_bug.cgi?id\u003d23532\" rel\u003d\"nofollow\"\u003e23532\u003c/a\u003e - \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eDealing with undefined) \u003c/span\u003eand not currently implemented.\u003cbr /\u003e\r\nFurther, note that in some cases one wants different behavior for \u003ccode\u003ef()\u003c/code\u003e and \u003ccode\u003ef(undefined)\u003c/code\u003e, which requires an explicit overload, not an optional argument; a good example is \u003ccode\u003eWindow.alert()\u003c/code\u003e, namely \u003ccode\u003ealert()\u003c/code\u003e vs. \u003ccode\u003ealert(undefined)\u003c/code\u003e (see W3C Bug \u003ca href\u003d\"https://www.w3.org/Bugs/Public/show_bug.cgi?id\u003d25686\" rel\u003d\"nofollow\"\u003e25686\u003c/a\u003e).\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003enull\u003c/code\u003e affects function resolution for overloaded operations, due to preferring nullable types, but this is the only effect.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Function-resolution\" /\u003eFunction resolution\u003c/h3\u003e\r\n\u003cp\u003eWeb IDL has \u003ci style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003erequired\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e arguments and \u003c/span\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003eoptional\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e arguments. JavaScript does not: omitted arguments have \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003eundefined\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e value. In Web IDL, omitting optional arguments is \u003c/span\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003enot\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e the same as explicitly passing \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003eundefined\u003c/code\u003e: they call have different behavior (defined in the spec prose), and internally call different C++ functions implementing the operation.\u003c/p\u003e\r\n\u003cp\u003eThus if you have the following Web IDL function declaration:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003einterface A {\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    void foo(long x);\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e }; \u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e...the JavaScript \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003ea \u003d new A(); a.foo()\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e will throw a \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eTypeError\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. This is specified in Web IDL, and thus done by the binding code.\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003e\u003cp\u003e\r\n\r\nHowever, in JavaScript the corresponding function can be called without arguments:\r\n\u003c/p\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003efunction foo(x) { return x }\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e foo() // undefined\u003c/code\u003e\u003c/div\u003e \r\n\u003cp\u003eNote that \u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003efoo()\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e and \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003efoo(undefined)\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e are almost identical calls (and for this function have identical behavior): it only changes the value of \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003earguments.length\u003c/code\u003e.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eTo get \u003ci\u003esimilar\u003c/i\u003e behavior in Web IDL, the argument can be explicitly specified as \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eoptional\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e (or more precisely, \u003ccode\u003eoptional\u003c/code\u003e with \u003ccode\u003eundefined\u003c/code\u003e as a default value). However, these do \u003ci\u003enot\u003c/i\u003e need to have the same behavior, and do \u003ci\u003enot\u003c/i\u003e generate the same code: the spec may define different behavior for these calls, and the bindings call the implementing C++ functions with a different number of arguments, which is resolved by C++ overloading, and these may be implemented by different functions. \u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor example, given an optional argument such as:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003einterface A {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    void foo(optional long x);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e };\u003c/code\u003e\u003c/div\u003e\u003cp\u003e\r\nThis results in \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;background-color:transparent;font-size:10pt\"\u003ea \u003d new A(); a.foo()\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e being legal, and calling the underlying Blink C++ function implementing \u003ccode\u003efoo\u003c/code\u003e with no arguments, while \u003ccode\u003ea.foo(undefined)\u003c/code\u003e calls the underlying Blink function with one argument.\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor \u003c/span\u003e\u003ci style\u003d\"background-color:transparent;font-size:10pt\"\u003eoverloaded\u003c/i\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e operations, the situation is more complicated, and not currently implemented in Blink \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e(Bug \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d293561\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e293561\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e)\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. See the \u003c/span\u003e\u003ca href\u003d\"http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eoverload resolution algorithm\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e in the spec for details.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ePragmatically, passing \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eundefined\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e for an optional argument is necessary if you wish to specify a value for a later argument, but not earlier ones, but does not necessarily mean that you mean to pass in \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eundefined\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e explicitly; these instead get the special value \"missing\".\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ePassing \u003ccode\u003eundefined\u003c/code\u003e to the last optional argument has unclear behavior for the value of the argument, but does mean that it \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eresolves it to the operation with the optional argument, rather than others. (It then prioritizes nullable types and dictionary types, or unions thereof.) For example:\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003einterface A {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    void foo(optional long x);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    void foo(Node x);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e };\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis results in \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;color:rgb(0,96,0);font-family:monospace\"\u003ea \u003d new A(); a.foo(undefined)\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e resolving to the first \u003ccode\u003efoo\u003c/code\u003e, it is not clear if the resulting call is \u003ccode\u003ea.foo()\u003c/code\u003e, to \u003ccode\u003ea.foo\u003c/code\u003e with \"missing\", or (most likely) \u003ccode\u003ea.foo(undefined)\u003c/code\u003e (here using the first overloaded function): it affect overload resolution, but perhaps not argument values. Note that \u003ccode\u003eundefined\u003c/code\u003e is also a legitimate value for the argument of \u003ccode\u003eNode\u003c/code\u003e type, so it would not be illegal, but the overload resolution algorithm first picks optional arguments in this case.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eNote that Blink code implementing a function can also check arguments, and similarly, JavaScript functions can check\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e arguments, and access the number of arguments via \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003earguments.length\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, but these are not specified by the \u003ci\u003elanguage\u003c/i\u003e or checked by bindings.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cb\u003e\u003ci\u003eWarning:\u003c/i\u003e\u003c/b\u003e \u003ccode\u003eundefined\u003c/code\u003e is a \u003ci\u003evalid value\u003c/i\u003e for required arguments, and many interfaces \u003ci\u003edepend\u003c/i\u003e on this behavior \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eparticularly booleans, numbers, and dictionaries. Explicitly passing \u003ccode\u003eundefined\u003c/code\u003e, as in \u003ccode\u003ea.foo(undefined)\u003c/code\u003e, does \u003ci\u003enot\u003c/i\u003e cause a type error (assuming \u003ccode\u003efoo\u003c/code\u003e is unary)\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e. It is clearer if the parameter is marked as \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt\"\u003eoptional\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e (this changes semantics: the argument can now also be omitted, not just passed explicitly as \u003c/span\u003e\u003ccode style\u003d\"font-size:10pt\"\u003eundefined\u003c/code\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e), but this is not always done in the spec or in Blink's IDL files.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-File-organization\" /\u003eFile organization\u003c/h2\u003e\r\n\u003cdiv\u003eThe Web IDL spec treats the Web API as a single API, spread across various IDL fragments. In practice these fragments are \u003ccode\u003e.idl\u003c/code\u003e files, stored in the codebase alongside their implementation, with basename equal to the interface name. Thus for example the fragment defining the \u003ccode\u003eNode\u003c/code\u003e interface is written in n\u003ccode\u003eode.idl\u003c/code\u003e, which is stored in the \u003ccode\u003ethird_party/blink/renderer/core/dom\u003c/code\u003e directory, and is accompanied by \u003ccode\u003enode.h\u003c/code\u003e and \u003ccode\u003enode.cc\u003c/code\u003e in the same directory. In some cases the implementation has a different name, in which case there must be an \u003ccode\u003e[ImplementedAs\u003d...]\u003c/code\u003e extended attribute in the IDL file, and the \u003ccode\u003e.h/.cc\u003c/code\u003e files have basename equal to the value of the \u003ccode\u003e[ImplementedAs\u003d...]\u003c/code\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFor simplicity, each IDL file contains a \u003ci\u003esingle\u003c/i\u003e interface or dictionary, and contains all information needed for that definition, except for dependencies (below), notably any enumerations, implements statements, typedefs, and callback functions.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Dependencies\" /\u003eDependencies\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIn principle (as a matter of the Web IDL spec) any IDL file can depend on any other IDL file, and thus changing one file can require rebuilding all the dependents. In practice there are 4 kinds of dependencies (since other required definitions, like enumerations and typedefs, are contained in the IDL file for the interface):\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ccode\u003epartial interface\u003c/code\u003e – a single interface can be spread across a single main \u003ccode\u003einterface\u003c/code\u003e statement (in one file) and multiple other \u003ccode\u003epartial interface\u003c/code\u003e statements, each in a separate file (each \u003ccode\u003epartial interface\u003c/code\u003e statement is associated with a single main \u003ccode\u003einterface\u003c/code\u003e statement). In this case the IDL file containing the partial interface has some other name, often the actual interface name plus some suffix, and is generally named after the implementing class for the members it contains. From the point of view of spec authors and compilation, the members are just treated as if they appeared in the main definition. From the point of view of the build, these are awkward to implement, since these are incoming dependencies, and cannot be determined from looking at the main interface IDL file itself, thus requiring a global dependency resolution step.\u003c/li\u003e\r\n\u003cli\u003e\u003ccode\u003eimplements\u003c/code\u003e – this is essentially multiple inheritance: an interface can implement multiple other interfaces, and a given interface can be implemented by multiple other interfaces. This is specified by implements statements in the implementing file (these are outgoing dependencies), though from the perspective of the build the interface → .idl filename of that interface data is required, and is global information (because the .idl files are spread across the source tree).\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eAncestors\u003c/b\u003e – an interface may have a parent, which in turn may have a parent. The immediate parent can be determined from looking at a single IDL file, but the more distant ancestors require dependency resolution (computing an ancestor chain).\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eUsed interfaces (cross dependencies)\u003c/b\u003e – a given interface may \u003ci\u003euse\u003c/i\u003e other interfaces as \u003ci\u003etypes\u003c/i\u003e in its definitions; the contents of the used interfaces \u003ci\u003emay\u003c/i\u003e affect the bindings generated for the using interface, though this is often a \u003ci\u003eshallow dependency\u003c/i\u003e (see below).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eIn practice, what happens is that, when compiling a given interfaces, its partial interfaces and the other interfaces it implements are merged into a single data structure, and that is compiled. There is a small amount of data recording where exactly a member came from (so the correct C++ class can be called), and a few other extended attributes for switching the partial/implemented interface on or off, but otherwise it is as if all members were specified in a single \u003ccode\u003einterface\u003c/code\u003e statement. This is a \u003cb\u003edeep dependency\u003c/b\u003e relationship: \u003ci\u003eany\u003c/i\u003e change in the partial/implemented interface changes the bindings for the overall (merged) interface, since \u003ci\u003eall\u003c/i\u003e the data is in fact used.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eBindings for interfaces in general do \u003ci\u003enot\u003c/i\u003e depend on their ancestors, beyond the name of their immediate parent. This is because the bindings just generate a class, which refers to the parent class, but otherwise is subject to information hiding. However, in a few cases bindings depend on whether the interface inherits from some other interface (notably EventHandler or Node), and in a few cases bindings depend on the extended attributes of ancestors (these extended attributes are \"inherited\"; the list is \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/scripts/compute_interfaces_info_overall.py?q\u003dINHERITED_EXTENDED_ATTRIBUTES\u0026amp;l\u003d59\"\u003ecompute_dependencies.INHERITED_EXTENDED_ATTRIBUTES\u003c/a\u003e, and consists of extended attributes that affect memory management). There is thus a \u003cb\u003eshallow dependency\u003c/b\u003e on ancestors, specifically only on the ancestor chain and on inherited extended attributes, not on the other contents of ancestors.\u003c/p\u003e\r\n\u003cp\u003eOn the other hand, the dependencies on used interfaces – so-called \u003cb\u003ecross dependencies\u003c/b\u003e – are generally \u003cb\u003eshallow dependency\u003c/b\u003e relationships: the using interface does not need to know much about the used interface (currently just the name of the implementing class, and whether the interface is a callback interface or not). Thus \u003ci\u003ealmost all changes\u003c/i\u003e in the used interface do not change the bindings for the using interface: the public information used by other bindings is minimal. There is one exception, namely the \u003ccode\u003e[PutForwards]\u003c/code\u003e extended attribute (in standard Web IDL), where the using interface needs to know the type of an attribute in the used interface. This \"generally shallow\" relationship may change in future, however, as being able to inspect the used interface can simplify the code generator. This would require the using interface to depend on used interfaces, either rebuilding all using interfaces whenever a used interface is changed, or clearly specifying or computing the public information (used by code generator of other interfaces) and depending only on that.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-IDL-extended-attribute-validator\" /\u003eIDL extended attribute validator\u003c/h2\u003e\r\n\u003cp\u003eTo avoid bugs caused by typos in extended attributes in IDL files, the extended attribute validator was introduced to the Blink build flow to check if all the extended attributes used in IDL files are implemented in the code generator. If you use an extended attribute not implemented in code generators, the extended attribute validator fails, and the Blink build fails.\u003c/p\u003e\r\n\r\n\u003cp\u003eA list of IDL attributes implemented in code generators is described in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/IDLExtendedAttributes.txt\"\u003eIDLExtendedAttributes.txt\u003c/a\u003e. If you want to add a new IDL attribute, you need to\u003c/p\u003e\r\n\r\n\u003col\u003e\u003cli\u003eadd the extended attribute to Source/bindings/IDLExtendedAttributes.txt.\u003c/li\u003e\r\n\u003cli\u003eadd the explanation to the extended attributes document.\u003c/li\u003e\r\n\u003cli\u003eadd test cases to run-bindings-tests (explained below).\u003c/li\u003e\r\n\u003c/ol\u003e\u003cdiv\u003eNote that the validator checks for known extended attributes and their arguments (if any), but does not enforce correct use of the the attributes. A warning will not be issued if, for example, \u003ccode\u003e[Clamp]\u003c/code\u003e is specified on an interface.\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Tests\" /\u003eTests\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Reference-tests-run-bindings-tests-\" /\u003eReference tests (run-bindings-tests)\u003c/h3\u003e\r\n\u003cp\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/tools/run_bindings_tests.py\"\u003ethird_party/blink/tools/run_bindings_tests.py\u003c/a\u003e tests the code generator, including its treatment of extended attributes. Specifically, run_bindings_tests.py compiles the IDL files in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/tests/idls/\"\u003ebindings/tests/idls\u003c/a\u003e, and then compares the results against reference files in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/tests/results/\"\u003ebindings/tests/results\u003c/a\u003e. For example, run_bindings_tests.py reads test_object.idl, and then compares the generated results against v8_test_object.h and v8_test_object.cc, reporting any differences.\u003c/p\u003e\r\n\r\n\u003cp\u003eIf you change the behavior of the code generator or add a new extended attribute, please add suitable test cases, preferably \u003ci\u003ereusing\u003c/i\u003e existing IDL files (this is to minimize size of diffs when making changes to overall generated bindings). You can reset the run-bindings-tests results using the --reset-results option:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ethird_party/blink/tools/run_bindings_tests.py --reset-results\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e \u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;line-height:normal;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003erun_bindings_tests.py \u003c/span\u003eis run in a presubmit script for any changes to Source/bindings: this requires you to update test results when you change the behavior of the code generator, and thus if test results get out of date, the presubmit test will fail: you won't be able to upload your patch via git-cl, and the CQ will refuse to process the patch.\u003c/span\u003e\r\n\u003cp\u003eThe objective of run-bindings-tests is to show you and reviewers how the code generation is changed by your patch. \u003cb\u003eIf you change the behavior of code generators, you need to update the results of run-bindings-tests.\u003c/b\u003e\u003c/p\u003e\r\n\u003cp\u003eDespite these checks, sometimes the test results can get out of date; this is primarily due to dcommitting or changes in real IDL files (not in Source/bindings) that are used in test cases\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e. If the results are out of date \u003c/span\u003e\u003ci style\u003d\"font-size:10pt;background-color:transparent\"\u003eprior\u003c/i\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e to your CL, please rebaseline them separately, before committing your CL, as otherwise it will be difficult to distinguish which changes are due to your CL and which are due to rebaselining due to older CLs.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003eNote that using real interfaces in test IDL files means changes to \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ereal IDL files can break run-bindings-tests\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e(e.g., Blink\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://src.chromium.org/viewvc/blink?revision\u003d174804\u0026amp;view\u003drevision\" style\u003d\"font-size:10pt;background-color:transparent\"\u003er174804\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e/CL \u003c/span\u003e\u003ca href\u003d\"https://codereview.chromium.org/292503006/\" style\u003d\"font-size:10pt;background-color:transparent\"\u003e292503006\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e: Oilpan: add [WillBeGarbageCollected] for Node., since Node is inherited by test files)\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e. \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThis is ok (we're not going to run \u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003erun_bindings_tests.py\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e on every IDL edit, \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eand it's easy to fix), but something to be aware of.\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003eIt is also possible for \u003cspan style\u003d\"font-size:13.3333px\"\u003erun_bindings_tests.py\u003c/span\u003e to break for other reasons, since it use the developer's local tree: it thus may pass locally but fail remotely, or conversely. For example, renaming Python files can result in outdated bytecode (.pyc files) being used locally and succeeding, even if \u003cspan style\u003d\"font-size:13.3333px\"\u003erun_bindings_tests.py\u003c/span\u003e is incompatible with current Python source (.py), as discussed and fixed in CL \u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://codereview.chromium.org/301743008/\"\u003e301743008\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Behavior-tests\" /\u003eBehavior tests\u003c/h3\u003e\u003cdiv\u003eTo test behavior, use \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_tests.md\" target\u003d\"_blank\"\u003eweb tests\u003c/a\u003e, most simply actual interfaces that use the behavior you're implementing. If adding new behavior, it's preferable to make code generator changes and the first actual use case in the same CL, so that it is properly tested, and the changes appear in the context of an actual change. If this makes the CL too large, these can be split into a CG-only CL and an actual use CL, committed in sequence, but unused features should not be added to the CG.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor general behavior, like type conversions, there are some internal tests, like \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/LayoutTests/bindings/webidl-type-mapping.html\" style\u003d\"font-size:10pt;background-color:transparent\"\u003ebindings/webidl-type-mapping.html\u003c/a\u003e, which uses \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/testing/type_conversions.idl\" style\u003d\"font-size:10pt;background-color:transparent\"\u003etesting/type_conversions.idl\u003c/a\u003e. There are also some other IDL files in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/testing/\"\u003etesting\u003c/a\u003e, like\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/testing/internals.idl\"\u003etesting/internals.idl\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Where-is-the-bindings-code-generated-\" /\u003eWhere is the bindings code generated?\u003c/h2\u003e\r\n\u003cp\u003eBy reading this document you can learn how extended attributes work. However, the best practice to understand extended attributes is to try to use some and watch what kind of bindings code is generated.\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you change an IDL file and rebuild (e.g., with ninja or Make), the bindings for that IDL file (and possibly others, if there are dependents) will be rebuilt. If the bindings have changed (in ninja), or even if they haven't (in other build systems), it will also recompile the bindings code. Regenerating bindings for a single IDL file is very fast, but regenerating all of them takes several minutes of CPU time.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIn case of xxx.idl in the Release build, the bindings code is generated in the following files (\"Release\" becomes \"Debug\" in the Debug build).\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003eout/Release/gen/third_party/blink/renderer/bindings/{core,modules}/v8_xxx.{h,cc}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Limitations-and-improvements\" /\u003eLimitations and improvements\u003c/h2\u003e\r\n\u003cp style\u003d\"font-size:13.3333330154419px\"\u003eA few parts of the Web IDL spec are not implemented; features are implemented on an as-needed basis. \u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eSee \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?q\u003dcomponent:Blink%3EBindings\"\u003ecomponent:Blink\u0026gt;Bindings\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e for open bugs; please feel free to file bugs or contact bindings developers (\u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!members/blink-reviews-bindings\" style\u003d\"font-size:10pt;background-color:transparent\"\u003emembers of blink-reviews-bindings\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e, or \u003c/span\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/blink/renderer/bindings/OWNERS\" style\u003d\"font-size:10pt;background-color:transparent\"\u003ebindings/OWNERS\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e) if you have any questions, problems, or requests.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eBindings generation can be controlled in many ways, generally by adding an extended attribute to specify the behavior, sometimes by special-casing a specific type, interface, or member. If the existing \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\"\u003eextended attributes\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e are not sufficient (or buggy), please file a bug and contact bindings developers!\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003eSome commonly encountered limitations and suitable workarounds are listed below. \u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eGenerally limitations can be worked around by using custom bindings, but these should be avoided if possible. \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eIf you need to work around a limitation, please put a \u003ccode\u003eTODO\u003c/code\u003e with the bug number (as demonstrated below) in the IDL so that we can remove the hack when the feature is implemented.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\" /\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Syntax-error-causes-infinite-loop\" /\u003eSyntax error causes infinite loop\u003c/h3\u003e\r\n\u003cdiv\u003eSome syntax errors cause the IDL parser to enter an infinite loop (Bug \u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d363830\"\u003e363830\u003c/a\u003e). Until this is fixed, if the compiler hangs, please terminate the compiler and check your syntax.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Type-checking\" /\u003eType checking\u003c/h3\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003eThe bindings do not do full type checking (Bug \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d321518\" style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003e321518\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003e). They do some type checking, but not all. Notably nullability is not strictly enforced. See \u003c/span\u003e\u003ccode style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003e[TypeChecking]\u003c/code\u003e under \u003cb\u003eundefined and null\u003c/b\u003e above\u003cspan style\u003d\"font-size:13.3333330154419px;font-weight:normal;background-color:transparent\"\u003e to see how to turn on more standard type checking behavior for interfaces and members.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Bindings-development\" /\u003eBindings development \u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Mailing-List\" /\u003eMailing List\u003c/h3\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-If-working-on-bindings-you-likely-wish-to-join-the-blink-reviews-bindings-mailing-list.\" /\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003eIf working on bindings, you likely wish to join the \u003c/span\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/blink-reviews-bindings\" style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003eblink-reviews-bindings\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal;background-color:transparent\"\u003e mailing list.\u003c/span\u003e\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-See-also\" /\u003eSee also\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/web-idl-interfaces\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeb IDL interfaces\u003c/a\u003e – overview how-to for Blink developers\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\"\u003eBlink IDL Extended Attributes\u003c/a\u003e \u003c/span\u003e– reference for Blink developers and bindings developers\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/idl-build\"\u003eIDL build\u003c/a\u003e – design doc\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/idl-compiler\"\u003eIDL compiler\u003c/a\u003e – design doc\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003e\r\n\u003chr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eDerived from: \u003ca href\u003d\"http://trac.webkit.org/wiki/WebKitIDL\" rel\u003d\"nofollow\"\u003ehttp://trac.webkit.org/wiki/WebKitIDL\u003c/a\u003e \u003ci\u003eLicensed\u003c/i\u003e\u003ci\u003e under \u003ca href\u003d\"http://www.webkit.org/coding/bsd-license.html\" rel\u003d\"nofollow\"\u003eBSD\u003c/a\u003e:\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003c/div\u003e\r\n\r\nBSD License\r\n\r\n\u003cp\u003eCopyright (C) 2009 Apple Inc. All rights reserved.\u003c/p\u003e\r\n\r\n\u003cp\u003eRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\u003c/p\u003e\r\n\r\n\u003cp\u003e1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\u003c/p\u003e\r\n\r\n\u003cp\u003e2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\u003c/p\u003e\r\n\r\n\u003cp\u003eTHIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2023764670965291136"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/webidl"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/224672608071467632"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/224672608071467632"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/224672608071467632"}],"author":[{"name":{"$t":"Joshua Bell"},"email":{"$t":"jsbell@chromium.org"}}],"sites$pageName":{"$t":"webidl"},"sites$revision":{"$t":"133"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9090453222028549966"},"published":{"$t":"2012-06-14T20:46:18.954Z"},"updated":{"$t":"2018-11-28T03:15:58.385Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-28T03:15:55.769Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Running web tests using the content shell"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis content now lives at \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_tests_in_content_shell.md\" target\u003d\"_blank\"\u003edocs/testing/web_tests_in_content_shell.md\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/119541804460292484"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/webkit-layout-tests/content-shell"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9090453222028549966"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9090453222028549966"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9090453222028549966"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"content-shell"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4661018567103573858"},"published":{"$t":"2013-07-21T20:21:24.456Z"},"updated":{"$t":"2018-11-28T03:14:38.631Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-28T03:14:35.197Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Fixing web test flakiness"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eThis content now lives at \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/identifying_tests_that_depend_on_order.md\" target\u003d\"_blank\"\u003edocs/testing/identifying_tests_that_depend_on_order.md\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/119541804460292484"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/webkit-layout-tests/identifying-tests-that-depend-on-order"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4661018567103573858"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4661018567103573858"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4661018567103573858"}],"author":[{"name":{"$t":"Ojan Vafai"},"email":{"$t":"ojan@chromium.org"}}],"sites$pageName":{"$t":"identifying-tests-that-depend-on-order"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"KXsmYD1QEw..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/119541804460292484"},"published":{"$t":"2008-09-25T23:35:57.191Z"},"updated":{"$t":"2018-11-28T03:13:44.079Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-28T03:13:39.259Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Web Tests"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003eThis content now lives at \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_tests.md\" target\u003d\"_blank\"\u003edocs/testing/web_tests.md\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/webkit-layout-tests"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/119541804460292484"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/119541804460292484"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/119541804460292484"}],"author":[{"name":{"$t":"Tony Chang"},"email":{"$t":"tony@chromium.org"}}],"sites$pageName":{"$t":"webkit-layout-tests"},"sites$revision":{"$t":"195"}},{"gd$etag":"\"XCl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5836160956403940197"},"published":{"$t":"2014-06-30T04:30:44.468Z"},"updated":{"$t":"2018-11-28T03:11:20.001Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-28T03:11:17.296Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Web Test Style Guidelines"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/testing/writing_web_tests.md\" style\u003d\"font-size:xx-large;background-color:transparent\" target\u003d\"_blank\"\u003edocs/testing/writing_web_tests.md\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3943503039573752869"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/coding-style/layout-test-style-guidelines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5836160956403940197"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5836160956403940197"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5836160956403940197"}],"author":[{"name":{"$t":"Takeshi Yoshino"},"email":{"$t":"tyoshino@chromium.org"}}],"sites$pageName":{"$t":"layout-test-style-guidelines"},"sites$revision":{"$t":"45"}},{"gd$etag":"\"KXsmYD1bEw..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7837262539569950464"},"published":{"$t":"2009-07-10T19:28:39.282Z"},"updated":{"$t":"2018-11-22T00:58:41.650Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-22T00:58:39.967Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Try Server usage"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/infra/trybot_usage.md\"\u003eThis page has moved.\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/try-server-usage"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7837262539569950464"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7837262539569950464"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7837262539569950464"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$pageName":{"$t":"try-server-usage"},"sites$revision":{"$t":"125"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/997383098754948637"},"published":{"$t":"2018-11-21T22:50:42.890Z"},"updated":{"$t":"2018-11-21T22:51:04.244Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-21T22:51:02.183Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autoplay Pre-Seeding in Chrome"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-s-Autoplay-policy-uses-a-metric-called-Media-Engagement-Index-MEI-to-determine-whether-or-not-to-permit-media-to-autoplay-on-a-given-site.-MEI-learns-locally-from-a-user-s-individual-browsing-behaviors-on-a-site-by-site-basis-whether-the-user-regula\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003eChrome's Autoplay policy uses a metric called Media Engagement Index (MEI) to determine whether or not to permit media to autoplay on a given site.  MEI learns, locally, from a user's individual browsing behaviors, on a site-by-site basis, whether the user regularly consumes media on each site. This helps Chrome to meet user expectations; if a user frequently consumes media for longer than 7 seconds in a previously activated tab, their media engagement score will increase, and eventually autoplay will be permitted for that site without a user gesture. Today, Chrome typically learns a user’s preferences within six to twenty visits.\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eGenerally users do expect autoplay behavior for some sites, and until Chrome learns individual preferences, based on MEI history, simply blocking all autoplay isn’t the best match for user expectations.  So, for new users, or users who clear their browsing history, who won’t have historical media engagement data, Chrome has a pre-seeded list of sites that are permitted to autoplay media, based on aggregated anonymized data on what percentage of visitors to that site regularly permit media playback with sound.  This ensures that the default behavior for sites with a high frequency of permitted media playbacks is most likely to match what a typical visitor to that site expects - as a user continues to use Chrome, their individual preferences will supplant the pre-seeded MEI scores. \u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eThe pre-seeded site list is generated based on the global percentage of site visitors who train Chrome to allow autoplay for that site; a site will be included on the list if a sizable majority of site visitors permit autoplay on it.  The list is algorithmically generated, rather than manually curated, and with no minimum traffic requirement. With the implementation of the autoplay policy for Web Audio in M71, Web Audio playback is also included in calculating the MEI score for a given site.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5779488377507415211"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/audio-video/autoplay/autoplay-pre-seeding-in-chrome"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/997383098754948637"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/997383098754948637"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/997383098754948637"}],"author":[{"name":{"$t":"Tom Greenaway"},"email":{"$t":"tomgreenaway@chromium.org"}}],"sites$pageName":{"$t":"autoplay-pre-seeding-in-chrome"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5347628687736053703"},"published":{"$t":"2018-11-21T22:49:36.086Z"},"updated":{"$t":"2018-11-21T22:49:56.958Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-21T22:49:54.827Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autoplay Policy Design Rationale"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis page captures the first principles and design rationale for the autoplay policy in Chrome.\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:14pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Problem\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eProblem\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBrowsers have historically been poor at helping the user manage\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esound, and unwanted noise is the primary reason that users don’t want autoplay. However, not all autoplay is unwanted, and a significant portion of blocked autoplays in Chrome are subsequently played by the user.\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:14pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Vision\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eVision\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA core mission of Chrome is \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003esimplicity\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and ideally Chrome would accurately allow audio playback when a user wants it, and prevent surprises when they don’t. A long-term goal is for fewer users to block audio at the OS level, meaning that more users will hear sound overall. It’s unlikely that Chrome can be 100% accurate at meeting user expectations, but a reasonable vision is:\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFor 99% of users, Chrome will be \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e95% accurate\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e at predicting when a user wants an audible playback before a user gesture on a page.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn cases where Chrome is inaccurate (for example, while learning the user’s preferences), \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e99% of the time\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the user will control sound by interacting with the page.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen the page does not allow the user to control sound, or when a user more generally has different requirements than what Chrome can provide, Chrome will provide the user control over their browsing experience. \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eDirect interaction with Chrome to manage sound will be infrequent\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRealization of this vision would result in the following user experience\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:lower-alpha;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn 95% of browsing sessions, audio will match user expectations.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:lower-alpha;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn 4.95% of browsing sessions, users will interact with the page to control audio.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:lower-alpha;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn 0.05% of browsing sessions, users will either terminate the session or will use Chrome to control audio.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:14pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Core-Principles\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eCore Principles\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe following core principles were used to design Chrome’s autoplay policy. \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNote that these principles \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edo not apply\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e when the user has made an explicit choice in Chrome to control sound for a site. For example, if a user has muted a site, these principles do not apply.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e1. User Gesture Should Allow Sound\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf users ask for sound, they should get it. A core user expectation is that hitting ‘play’ (e.g. on a media element or a game) will enable audio. But any HTML element could be a ‘play’ button and Chrome can’t tell the difference. Thus, Chrome must assume that \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eany user gesture should allow sound playback on the page\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e2. Sites Can’t Control The Policy\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are incentives for sites to play video and audio regardless of user expectations, and sites will leverage any API they can to play audio on page load. The site cannot be a steward of the user’s audio experience before a user gesture, and cannot override Chrome’s policy choices. For this reason, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethe site cannot override Chrome’s choices or control when autoplay is allowed.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e3. The Site Must Know when Audio or Autoplay is Blocked\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen the policy blocks autoplay for audible media, site developers may want to show a different user experience (e.g. click-to-play), apply different logic (e.g. choosing muted ads), and at the very least will want to update any visual indication of audio playback state (e.g. a volume status indicator). For this reason, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eif autoplay with audio is blocked the site must know that it is blocked\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e4. The Site Must Be Allowed To Request the User Gesture\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA user gesture is on the page, and the site is thus best positioned to present a UX that explains the impact of a user gesture to enable sound, give a place to click or tap, and apply logic to that user gesture. Alternatives where Chrome enables sound arbitrarily will be more confusing for the user. For this reason, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethe site (not Chrome) is in the best position to help the user play media with sound.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e5. The Site Needs Predictable Behavior\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen sound \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eis\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e allowed, developers need predictable control over audio playback state, to ensure that the right elements are playing, the UX is in sync, and the timing of audio playback is aligned with other elements on the page. Alternatives where Chrome enables sound or plays media arbitrarily may break sites or cause a poor user experience. For this reason, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethe site must be responsible for starting playback or enabling audio when it is allowed.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e6. User-Initiated Audio Playback is a Moderately Strong Signal to Chrome\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSustained, audible playback as a result of a user gesture is a moderately strong signal that audio was desired. This signal is not perfect (e.g. a site could hijack a click and play audio on a system that has no speakers). However, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome will use regular, sustained playback as a signal of user intent.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e7. Chrome Must Learn And Adapt to User Preferences\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA key learning from early MEI analysis was that there is a wide range of user preferences for audio playback. This is true not only across different sites, but even within the same site where one user might find audio annoying, but another will expect it to work automatically. Chrome cannot rely upon a static list of ‘acceptable’ sites and must learn and adapt to individual user preferences. As such, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor each individual user Chrome will learn on which sites autoplay is expected, and where it is not. All sites will be subjected to the same rules; there are no sites where autoplay is always expected by all users.\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:14pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Design-Implications\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eDesign Implications\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe above principles drive the following design conclusions:\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Can’t Prompt To Enable Audio\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSites will generally present a UX that allows the user to enable audio. If Chrome adds its own prompt, this will lead to user confusion about where to click, and additional friction in cases where users end up clicking twice. \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(Note: A more subtle UX such as a play/pause button in the Omnibox may still be acceptable, especially if the logic which detects when to display it is designed to avoid confusion.)\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Can’t Use Tab Muting For Automatic Control\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutomatic management of sound through tab muting wouldn’t allow the site to detect that they were muted, and wouldn’t allow them to manage user expectations. Further, it would prevent the site from prompting for a user gesture and managing user expectations.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Site (not Chrome) Must Enable Audio\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf Chrome enables audio, it may appear random to the developer, meaning that the site UX gets out of sync, and developers may lose control over which audio elements are playing. Further, the developer may (in response to a user gesture) wish to perform tasks \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ebefore\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e enabling sound. The developer, not Chrome, must be responsible for enabling sound after a user gesture.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBlocking, Not Muting, for Chrome’s Default Behavior\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBlocking audio is a predictable, active signal that audio is not allowed. Mute state introduces unpredictability for developers, because it requires a query after audio has started. In cases where audio playback triggers a visual display, developers may not be able to prevent a brief flash of visuals before they can make the query and disable the visuals.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFurther, (1) the use of mute state is inconsistent with existing policies for audio management (e.g. in other browsers, on mobile, or in IFrames), (2) not all audio APIs have provisions for muting, (3) for APIs that do have mute attributes, making them dynamically controlled by Chrome overloads their behavior, and (4) it consumes more CPU power to have a running (muted) stream than a stopped one.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eNot like pop-up blocker\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSound management will not eliminate sound, nor will it eliminate autoplay (which will be allowed when Chrome believes the user wants it). The frequency of scenarios where a user wants autoplay will not decrease over time. This puts autoplay in a different category than other types of interventions, where the behavior being blocked is expected to fall into disuse, reducing the frequency of Chrome-based prompts.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFurther, it is expected that over time most sites will monitor their attempts to autoplay and manage the user experience when it is not allowed. This will over time reduce the need for any type of Chrome-based prompt to enable blocked autoplay.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5779488377507415211"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/audio-video/autoplay/autoplay-policy-design-rationale"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5347628687736053703"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347628687736053703"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347628687736053703"}],"author":[{"name":{"$t":"Tom Greenaway"},"email":{"$t":"tomgreenaway@chromium.org"}}],"sites$pageName":{"$t":"autoplay-policy-design-rationale"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1186199865635457160"},"published":{"$t":"2018-11-16T13:35:45.420Z"},"updated":{"$t":"2018-11-20T13:07:02.846Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-20T13:07:01.189Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"flag-ownership"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003eMoved to /developers/contributing/\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/contributing-code/flag-ownership\"\u003eflag-ownership\u003c/a\u003e!\u003cbr /\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/flag-ownership"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1186199865635457160"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1186199865635457160"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1186199865635457160"}],"author":[{"name":{"$t":"Elly Fong-Jones"},"email":{"$t":"ellyjones@chromium.org"}}],"sites$pageName":{"$t":"flag-ownership"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8927872815267628552"},"published":{"$t":"2018-10-01T18:04:23.471Z"},"updated":{"$t":"2018-11-13T20:49:06.116Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-13T20:49:04.192Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Symantec Legacy PKI"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eFollowing our \u003c/span\u003e\u003ca href\u003d\"https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eannouncement\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e in September 2017 to distrust the Legacy Symantec PKI, Chrome has executed on this plan in incremental phases across several releases. As described in detail in previous announcements, this distrust is the result of a consensus of cross-browser efforts to maintain a trusted and secure web. The phased distrust of this PKI has been implemented as follows:\r\n\r\n\u003c/span\u003e\u003c/p\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"105\" /\u003e\u003ccol width\u003d\"519\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;background-color:#cfe2f3;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eRelease\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;background-color:#cfe2f3;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eDescription of Changes\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 65\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eRemove trust in certificates issued after December 1, 2017, effectively stopping trust in new issuance from the Legacy Symantec PKI.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 66\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eRemove trust in certificates issued from the Legacy Symantec PKI before June 01, 2016, which were the most at-risk certificates based on the \u003c/span\u003e\u003ca href\u003d\"https://wiki.mozilla.org/CA:Symantec_Issues\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003enumerous issues\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e identified by the Browser and Web PKI communities.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0pt\"\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 70\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003ctd style\u003d\"border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eRemove trust in all certificates issued from the Legacy Symantec PKI. Trust will be removed via \u003ca href\u003d\"https://textslashplain.com/2017/10/18/chrome-field-trials/\" rel\u003d\"nofollow\"\u003estaged rollout\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:11pt;white-space:pre-wrap\"\u003eWe are approaching the final phase of distrust now that M70 is about to reach Stable. The following describes Chrome’s behavior with respect to Legacy Symantec TLS certificates across our various release channels.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-71-and-beyond\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome 71 and beyond\u003c/span\u003e\u003c/h3\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Following-the-ramp-up-to-100-of-users-in-Chrome-70-Stable-Chrome-71-and-beyond-will-be-enabling-the-Legacy-Symantec-PKI-distrust-by-default.-This-change-is-present-in-all-release-channels:-Canary-Dev-Beta-and-Stable.-Users-observing-the-distrust-in-Chrome-\" /\u003e\u003cspan style\u003d\"color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;font-size:14.6667px;white-space:pre-wrap\"\u003e\u003cp style\u003d\"color:rgb(0,0,0);line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003eFollowing the ramp-up to 100% of users in Chrome 70 Stable, Chrome 71 and beyond will be enabling the Legacy Symantec PKI distrust by default. This change is present in all release channels: Canary, Dev, Beta, and Stable. Users observing the distrust in Chrome 70 should experience the exact same behavior in Chrome 71 and up.\u003c/font\u003e\u003c/p\u003e\u003c/span\u003e\u003c/h3\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-70-Stable\" /\u003e\u003cspan style\u003d\"font-size:13.999999999999998pt;font-family:Arial;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 70 Stable\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eThe distrust of the Legacy Symantec PKI is rolling out to users of Chrome throughout the release of Chrome 70. At the initial release of Chrome 70, this change will reach a small percentage of Chrome 70 users, and then slowly scaling up to 100% of Chrome 70 users over several weeks. This approach seeks to minimize any remaining breakage associated with this change while still providing affected sites the ability to diagnose and take corrective action.\r\n\r\n\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eSite Operators receiving problem reports from users are strongly encouraged to take corrective action by replacing their website certificates as soon as possible. Instructions on how to determine whether your site is affected as well as what corrective action is needed can be found \u003c/span\u003e\u003cspan style\u003d\"text-decoration:underline;font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html\" style\u003d\"text-decoration:none\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-70-Early-Release-Channels\" /\u003e\u003cspan style\u003d\"font-size:13.999999999999998pt;font-family:Arial;color:#434343;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 70 Early Release Channels\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 70 Canary and Dev\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eIn M70 Canary and Dev, the Symantec PKI has been distrusted by default for all users. In these release channels, page loads over TLS connecting to sites using Legacy Symantec TLS certificates display a full page interstitial with the error code NET::ERR_CERT_SYMANTEC_LEGACY. Additionally, subresources served over such connections will fail to load, possibly degrading site functionality.  \r\n\r\n\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eChrome 70 Beta\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eDistrust in the Legacy Symantec PKI was rolled out over time, starting with the first Chrome 70 Beta. As a result of this Beta period, many sites still using Legacy Symantec TLS certificates replaced their certificates\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:11pt;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/symantec-legacy-pki"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8927872815267628552"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8927872815267628552"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8927872815267628552"}],"author":[{"name":{"$t":"Andrew Whalley"},"email":{"$t":"awhalley@chromium.org"}}],"sites$pageName":{"$t":"symantec-legacy-pki"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2694871504527811545"},"published":{"$t":"2015-09-25T23:17:48.554Z"},"updated":{"$t":"2018-11-13T00:21:29.601Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-13T00:21:27.350Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mob Monitor"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-DEPRECATED-PLEASE-VISIT-https:-sites.google.com-a-chromium.org-dev-chromium-os-testing-moblab-20170714-\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003e***DEPRECATED, PLEASE VISIT \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\u003c/a\u003e *** (20170714)\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6163425214481340131"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab/mob-monitor"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2694871504527811545"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2694871504527811545"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2694871504527811545"}],"author":[{"name":{"$t":"Matthew Sartori"},"email":{"$t":"msartori@chromium.org"}}],"sites$pageName":{"$t":"mob-monitor"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"Wil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8051579724266212911"},"published":{"$t":"2014-07-28T00:52:17.075Z"},"updated":{"$t":"2018-11-12T21:25:51.685Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-12T21:25:49.976Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using MobLab"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,0,0);font-size:x-large;font-weight:bold\"\u003e***DEPRECATED, PLEASE VISIT \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\u003c/a\u003e *** (20170714)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6163425214481340131"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab/usingmoblab"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8051579724266212911"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8051579724266212911"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8051579724266212911"}],"author":[{}],"sites$pageName":{"$t":"usingmoblab"},"sites$revision":{"$t":"33"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8249727978514538455"},"published":{"$t":"2014-07-26T00:07:25.272Z"},"updated":{"$t":"2018-11-12T21:23:11.217Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-12T21:23:08.454Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Untitled"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,0,0);font-size:x-large;font-weight:bold\"\u003e***DEPRECATED, PLEASE VISIT \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,0,0);font-size:x-large;font-weight:700\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(255,0,0);font-size:x-large;font-weight:700\"\u003e *** (20170714)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003col\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6163425214481340131"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/moblab/setup"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8249727978514538455"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8249727978514538455"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8249727978514538455"}],"author":[{}],"sites$pageName":{"$t":"setup"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3640635051427197487"},"published":{"$t":"2018-04-13T17:53:50.071Z"},"updated":{"$t":"2018-11-05T09:23:20.345Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-11-05T09:23:17.834Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Meltdown/Spectre vulnerability status for Chrome OS devices"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eThis page details status for Chrome OS devices regarding the \u003ca href\u003d\"https://meltdownattack.com/\" rel\u003d\"nofollow\"\u003eMeltdown and Spectre vulnerabilities\u003c/a\u003e, also known as \u003ca href\u003d\"https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html\" rel\u003d\"nofollow\"\u003e\"speculative execution vulnerabilities\" described by Google Project Zero\u003c/a\u003e.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e(Previously located at \u003ca href\u003d\"https://www.chromium.org/chrome-os-devices-and-kernel-versions\"\u003ehttps://www.chromium.org/chrome-os-devices-and-kernel-versions\u003c/a\u003e.)\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Meltdown\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eMeltdown\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Variant-3-CVE-2017-5754-\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eVariant 3 (CVE-2017-5754)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Protection-against-Variant-3\"\u003e\u003cstrong\u003e1.1.1 \u003c/strong\u003eProtection against Variant 3\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Older-Intel-devices\"\u003e\u003cstrong\u003e1.1.2 \u003c/strong\u003eOlder Intel devices\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-ARM-devices\"\u003e\u003cstrong\u003e1.1.3 \u003c/strong\u003eARM devices\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Spectre\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eSpectre\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Variant-1-CVE-2017-5753-\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eVariant 1 (CVE-2017-5753)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Variant-2-CVE-2017-5715-\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eVariant 2 (CVE-2017-5715)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Intel-devices\"\u003e\u003cstrong\u003e2.2.1 \u003c/strong\u003eIntel devices\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-ARM-devices1\"\u003e\u003cstrong\u003e2.2.2 \u003c/strong\u003eARM devices\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Speculative-store-buffer-bypass-variant-4-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSpeculative store buffer bypass (variant 4)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Vulnerability-description\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eVulnerability description\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chrome-OS-response\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eChrome OS response\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Affected-devices\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eAffected devices\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Meltdown\" /\u003e\u003cspan\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"6\"\u003eMeltdown\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\r\n\u003cdiv\u003eGoogle has been working on updates that contain the Kernel Page Table Isolation (KPTI) mitigation for Meltdown. ARM Chrome OS devices are not affected by Meltdown. Most Intel devices received KPTI with M63. All Intel devices have received KPTI with M66, and therefore all Intel Chrome OS devices are now protected against Meltdown.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e(2018-May-22: Updated to note that all Intel devices are now protected against Meltdown.)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Variant-3-CVE-2017-5754-\" /\u003e\u003cfont size\u003d\"4\"\u003eVariant 3 (\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003dCVE-2017-5754\" rel\u003d\"nofollow\"\u003eCVE-2017-5754\u003c/a\u003e)\u003c/font\u003e\u003c/h3\u003e\r\n\u003cfont size\u003d\"3\"\u003eThe following subsections indicate the vulnerability status of Chrome OS hardware for Variant 3 (\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003dCVE-2017-5754\" rel\u003d\"nofollow\"\u003eCVE-2017-5754\u003c/a\u003e), which is also referred to as Meltdown.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Protection-against-Variant-3\" /\u003e\u003cfont size\u003d\"3\"\u003eProtection against Variant 3\u003c/font\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"3\"\u003eThese devices have received the KPTI / KAISER patch in Chrome OS 63 and are protected against Meltdown:\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;background-color:transparent;margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"348\" /\u003e\r\n\u003ccol width\u003d\"210\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003eMarketing name\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003ePublic codename\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eDell Chromebook 13 3380\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003easuka\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook 15 (CB3-532)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ebanon\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eSamsung Chromebook Pro\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ecaroline\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook Flip C302\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ecave\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eSamsung Chromebook 3\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eceles\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHP Chromebook 13 G1\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003echell\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook R11 (CB5-132T / C738T)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ecyan\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eChromebook 14 (CB3-431)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eedgar\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eChromebook 11 Model 3180\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ekefka\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eChromebook 14 for work (CP5-471)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003elars\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook 11 (C771, C771T)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003elili\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHP Chromebook 11 G5 EE\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003elocke\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N23 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ereks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N23 Chromebook (Touch)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ereks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N42 (Touch) Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ereks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N22 (Touch) Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ereks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eMecer V2 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003erelm\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eEdxis Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003erelm\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eCTL NL61 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003erelm\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eDell Chromebook 11 3189\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esabin\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eThinkpad 13 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esentry\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHP Chromebook 11 G5 / HP Chromebook 11-vxxx\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esetzer\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook C202SA\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eterra\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook C300SA/C301SA\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eterra13\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook 11 N7 (C731)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003etifa\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eThinkPad 11e Chromebook 3rd Gen (Yoga/Clamshell)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eultima\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eMultilaser M11C Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eViglen Chromebook 360\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ePCMerge Chromebook PCM-116T-432B\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eEdugear CMT Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eCTL J5 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eProwise ProLine Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHaier Convertible Chromebook 11 C\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewizpig\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook 15 (CB3-531)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ebanjo\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook C213NA\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ebasking\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eDell Chromebook 11 (3120)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ecandy\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N20 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eclapper\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook Spin 11 (R751T)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eelectro\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eJP Sa Couto Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASI Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eeduGear Chromebook R\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eVideonet Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eTrue IDC Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eCrambo Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eRGS Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eEdxis Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eSenkatel C1101 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eM\u0026amp;A Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eCTL N6 Education Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eEducation Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eenguarde\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eGoogle Pixelbook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eeve\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eEdxis Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eexpresso\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eBobicus Chromebook 11\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eexpresso\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHEXA Chromebook Pi\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont\u003ee\u003c/font\u003e\u003cfont style\u003d\"font-family:Arial\"\u003expresso\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eConsumer Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eexpresso\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo ThinkPad 11e Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eglimmer\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAcer Chromebook 11 (C730 / C730E)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003egnawty\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eChromebook 11 (C735)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003egnawty+\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHaier Chromebook 11 G2\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eheli\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo N21 Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ehoofer\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHP Chromebook 11 2100-2199 / HP Chromebook 11 G3\u003c/font\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ekip\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHP Chromebook 11 2200-2299 / HP Chromebook 11 G4 / G4 EE\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ekip\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHP Chromebook 14 ak000-099 / HP Chromebook 14 G4\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ekip14\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAOpen Chromebox Commercial\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eninja\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo 100S Chromebook\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eorco\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eLenovo Thinkpad 11e Chromebook (4th Gen) / Lenovo Thinkpad Yoga 11e Chromebook (4th Gen)\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003epyro\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook C300MA\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003equawks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eChromebook 15 CB515-1HT/1H\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esand\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eHP Chromebook x360 11 G1 EE\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esnappy\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eASUS Chromebook C200MA\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esquawks\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eAOpen Chromebase Commercial\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003esumo\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eToshiba Chromebook 2\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eswanky\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003eSamsung Chromebook 2 11 - XE500C12\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003ewinky\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\r\n\u003c/font\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Older-Intel-devices\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"3\"\u003eOlder Intel devices\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003eThese devices with kernel 3.14 have received the KPTI / KAISER patch in Chrome OS 65\u003c/span\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003e and are protected against Meltdown:\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\r\n\u003cdiv style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;background-color:transparent;margin-left:0pt\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"347\" /\u003e\r\n\u003ccol width\u003d\"217\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebase 24\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ebuddy\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eToshiba Chromebook 2 (2015 Edition)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003egandof\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebox CN62\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eguado\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eDell Chromebook 13 7310\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003elulu\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebook 11 (C740)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003epaine\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebox CXI2\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003erikku\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eGoogle Chromebook Pixel (2015)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003esamus\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLenovo ThinkCentre Chromebox\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003etidus\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebook 15 (CB5-571)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eyuna\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003cfont size\u003d\"3\"\u003eThese devices with kernel 3.8 have received the \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium\"\u003eKPTI / KAISER patch in Chrome OS 66\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium\"\u003e and are protected against Meltdown:\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003ctable style\u003d\"background-color:transparent;white-space:pre-wrap;border:none;border-collapse:collapse\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"348\" /\u003e\r\n\u003ccol width\u003d\"216\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003eMarketing name\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003ePublic codename\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Pavilion Chromebook 14\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ebutterfly\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Chromebook 14\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003efalco\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eToshiba Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eleon\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eGoogle Chromebook Pixel\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003elink\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebox\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emccloud\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLG Chromebase 22CB25S\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLG Chromebase 22CV241\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebox CN60\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003epanther\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer C720 Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003epeppy\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLenovo Thinkpad X131e Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003estout\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebox Series 3\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003estumpy\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eDell Chromebox\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003etricky\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eDell Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ewolf\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Chromebox CB1-(000-099) / HP Chromebox G1 / HP Chomebox for Meetings\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ezako\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-ARM-devices\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"3\"\u003eARM devices\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\r\n\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"3\"\u003eARM Chrome OS devices are \u003cb\u003enot affected\u003c/b\u003e by Meltdown. This applies to the following devices:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"white-space:pre-wrap;background-color:transparent;font-size:14.6667px;margin-left:0pt\"\u003e\r\n\u003ctable style\u003d\"border:none;border-collapse:collapse\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"349\" /\u003e\r\n\u003ccol width\u003d\"214\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ePoin2 Chromebook 14\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ebirch\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebook R13 (CB5-312T)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eelm\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLenovo N23 Yoga/Flex 11 Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ehana\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ePoin2 Chromebook 11C\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ehanawl\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebook Flip C101PA\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ebob\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook Plus\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ekevin\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook 2 13\"\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003epi\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook 2 11\"\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003epit\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Chromebook 11 2000-2099 / HP Chromebook 11 G2\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eskate\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003esnow\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Chromebook 11 1100-1199 / HP Chromebook 11 G1\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003espring\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebook 13 (CB5-311)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ebig\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:26pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHP Chromebook 14 x000-x999 / HP Chromebook 14 G3\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eblaze\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAcer Chromebase\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ekitty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAOpen Chromebox Mini\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003efievel\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eMedion Akoya S2013\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejaq\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eTrue IDC Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejaq\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eXolo Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejaq\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHaier Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejaq\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eVideoNet Chromebook BL10\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eMecer Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ePositivo Chromebook CH1190\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eEpik 11.6\" Chromebook ELB1101\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eNComputing Chromebook CX100/110\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eeduGear Chromebook K Series\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eCTL J2 / J4 Chromebook for Education\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHiSense Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ePoin2 Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003ejerry\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebit CS10\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emickey\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eProwise 11.6\" Entry Line Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eMEDION Chromebook S2015\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eChromebook PCM-116E\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eLumos Education Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eViglen Chromebook 11\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eSector 5 E1 Rugged Chromebook\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eeduGear Chromebook M Series\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eNexian Chromebook 11.6-inch\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eHaier Chromebook 11e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003emighty\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebook Flip C100PA\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eminnie\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eASUS Chromebook C201PA\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003espeedy\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:15pt\"\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eAOpen Chromebase Mini\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border-left:solid #cccccc 0.75pt;border-right:solid #cccccc 0.75pt;border-bottom:solid #cccccc 0.75pt;border-top:solid #cccccc 0.75pt;vertical-align:bottom;padding:2pt 2pt 2pt 2pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003etiger\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\u003c/div\u003e\r\n\u003ch2 style\u003d\"white-space:pre-wrap;background-color:transparent;line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Spectre\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"6\"\u003eSpectre\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\r\n\u003cfont size\u003d\"3\"\u003eThe following subsections indicate Chrome OS status with respect to the Spectre vulnerability (also referred to as \"Variant 1\" and \"Variant 2\" in the Project Zero blog post). Spectre potentially allows access to data held in other processor execution contexts. The victim execution context (kernel or process) must have certain code patterns in their address space.\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Variant-1-CVE-2017-5753-\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"4\"\u003eVariant 1 (\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003dCVE-2017-5753\" rel\u003d\"nofollow\"\u003eCVE-2017-5753\u003c/a\u003e)\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"3\"\u003eThe Linux kernel has a feature called eBPF that is used to run untrusted code. The Project Zero blog post describes how this can be abused by attackers to generate vulnerable code patterns in the kernel. However, Chrome OS disables eBPF in its kernels and therefore is not exposed to Spectre Variant 1 via eBPF. Additional Spectre variant 1 mitigations available in the Chrome browser are described \u003ca href\u003d\"https://www.chromium.org/Home/chromium-security/ssca\"\u003ehere\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Variant-2-CVE-2017-5715-\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"4\"\u003eVariant 2 (\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003dCVE-2017-5715\" rel\u003d\"nofollow\"\u003eCVE-2017-5715\u003c/a\u003e)\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"3\"\u003e\r\n\u003cdiv\u003eThe Project Zero blog post describes how virtualization can be used to exploit Spectre Variant 2. \u003cspan style\u003d\"background-color:transparent\"\u003eChrome OS devices that ship \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md\"\u003eLinux VMs\u003c/a\u003e contain mitigations for Spectre variant 2.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e(2018-Oct-05: Updated to reflect usage of virtualization features on Chrome OS; fixes for ARM devices on kernel 3.18.)\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Intel-devices\" /\u003e\u003cb\u003eIntel devices\u003c/b\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eOn Intel devices we’ve deployed the \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/faqs/answer/7625886\" style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRetpoline\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003ecompiler-based mitigation for all Chrome OS kernels, starting with Chrome OS 65. This mitigation prevents kernel-to-user, guest-to-guest, and host-to-guest information leaks using Spectre variant 2.\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-ARM-devices1\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cb\u003eARM devices\u003c/b\u003e\u003c/span\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eOn ARM devices we’ve started integrating firmware and kernel patches \u003c/span\u003e\u003ca href\u003d\"https://developer.arm.com/support/security-update\" style\u003d\"background-color:transparent\" rel\u003d\"nofollow\"\u003esupplied by ARM\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e. ARM devices will receive updated firmware and kernels before they enable virtualization features.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eSome ARM devices on 4.4 kernels received Spectre variant 2 fixes with Chrome OS 67. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eThese fixes were later discovered to be incomplete and updated with Chrome OS 70\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" cellpadding\u003d\"0\" cellspacing\u003d\"0\" dir\u003d\"ltr\" style\u003d\"table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:none\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"196\" /\u003e\u003ccol width\u003d\"115\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;font-weight:bold;width:219px;height:15px\"\u003e\u003cfont size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;font-weight:bold;width:107px;height:15px\"\u003e\u003cfont size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:219px;height:18px\"\u003e ASUS Chromebook Flip C101PA\u003c/td\u003e\u003ctd style\u003d\"width:107px;height:18px\"\u003e bob\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:219px;height:15px\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook Plus\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:107px;height:15px\"\u003e\u003cfont size\u003d\"2\"\u003ekevin\u003cbr /\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSome ARM devices on 3.18 kernels will receive Spectre variant 2 fixes with Chrome OS 71:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" cellpadding\u003d\"0\" cellspacing\u003d\"0\" dir\u003d\"ltr\" style\u003d\"table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:none\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"266\" /\u003e\u003ccol width\u003d\"110\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:278px;height:15px\"\u003e\u003cb\u003eMarketing name\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:112px;height:15px\"\u003e\u003cb\u003ePublic codename\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:278px;height:15px\"\u003eAcer Chromebook R13 (CB5-312T)\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:112px;height:15px\"\u003eelm\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:278px;height:15px\"\u003ePoin2 Chromebook 14\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:112px;height:15px\"\u003ebirch\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:278px;height:15px\"\u003ePoin2 Chromebook 11C\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:112px;height:15px\"\u003ehana\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:278px;height:15px\"\u003eLenovo 300e/N23 Yoga/Flex 11 Chromebook\u003c/td\u003e\u003ctd style\u003d\"overflow:hidden;padding:2px 3px;vertical-align:bottom;width:112px;height:15px\"\u003ehana\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Speculative-store-buffer-bypass-variant-4-\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"6\"\u003eSpeculative store buffer bypass (variant 4)\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Vulnerability-description\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont size\u003d\"4\"\u003eVulnerability description\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cspan\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFollowing on their Meltdown and Spectre research, Google's Project Zero disclosed a fourth variant of their speculative execution attacks, Speculative store buffer bypass (\u003c/span\u003e\u003ca href\u003d\"https://cve.mitre.org/cgi-bin/cvename.cgi?name\u003dCVE-2018-3639\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCVE-2018-3639\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e). On Chrome OS this variant affects the Chrome browser and is also mitigated by \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/site-isolation\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSite Isolation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/span\u003e\u003c/span\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chrome-OS-response\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cspan\u003e\u003cfont size\u003d\"4\"\u003eChrome OS response\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cspan\u003e\u003cfont size\u003d\"3\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS 67 enables Site Isolation by default across the Chrome OS fleet. Chrome OS 67 will be released on the stable channel around June 5, 2018. Site isolation may increase memory use by approximately 10%. For more information on Site isolation, including how to enable it manually, see the \u003c/span\u003e\u003ca href\u003d\"https://support.google.com/chrome/answer/7623121\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Help article\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Affected-devices\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cspan\u003e\u003cfont size\u003d\"4\"\u003eAffected devices\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cspan\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIntel devices with Core processors, or Apollo Lake Atom processors, are affected by this variant. ARM devices with MTK8173 processors, or RK3399 processors, are affected by this variant. The \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecpu\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e line in the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome:system\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e page will show what CPU the device has.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e\u003cb\u003e\r\n\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003eThe following list covers affected devices that will be mitigated in Chrome OS 67:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\r\n\u003ctable border\u003d\"1\" cellpadding\u003d\"0\" cellspacing\u003d\"0\" dir\u003d\"ltr\" style\u003d\"table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;width:0px;border-collapse:collapse;border:none\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"324\" /\u003e\r\n\u003ccol width\u003d\"118\" /\u003e\r\n\u003ccol width\u003d\"154\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePlatform\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 11 G6 EE\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ealan\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (C732, C732T, C732L \u0026amp; C732LT)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eastronaut\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 13 3380\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003easuka\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebook C213NA\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebasking\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 14 G5\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebigdaddy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePoin2 Chromebook 14\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebirch\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMTK8173\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebook Flip C101PA\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebob\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eRK3399\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebase 24\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebuddy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSamsung Chromebook Pro\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ecaroline\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebook Flip C302\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ecave\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 13 G1\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003echell\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook Spin 11 (R751T)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eelectro\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook R13 (CB5-312T)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eelm\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMTK8173\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Pixelbook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eeve\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eKabylake-Y\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 14\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003efalco\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eToshiba Chromebook 2 (2015 Edition)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003egandof\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebox CN62\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eguado\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo 300e/N23 Yoga/Flex 11 Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ehana\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMTK8173\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePoin2 Chromebook 11C\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ehana\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMTK8173\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSamsung Chromebook Plus\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ekevin\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eRK3399\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eChromebook 14 for work (CP5-471)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elars\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook Spin 11 (CP311-1H \u0026amp; CP311-1HN)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elava\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eToshiba Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eleon\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (C771, C771T)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elili\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Chromebook Pixel\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elink\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIvy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 13 7310\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elulu\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebox\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emccloud\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLG Chromebase 22CV241\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLG Chromebase 22CB25S\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 11 5190\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003enasher\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 11 2-in-1 5190\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003enasher360\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (C740)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epaine\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebox CN60\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epanther\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer C720 Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epeppy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo Thinkpad 11e Chromebook (4th Gen)\u003cbr /\u003e\r\nLenovo Thinkpad Yoga 11e Chromebook (4th Gen)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epyro\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebox CXI2\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003erikku\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo 100e Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003erobo\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo 500e Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003erobo360\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Chromebook Pixel (2015)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esamus\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eChromebook 15 CB515-1HT/1H\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esand\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (CB311-8H \u0026amp; CB311-8HT)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esanta\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eThinkpad 13 Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esentry\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook x360 11 G1 EE\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esnappy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eApollo Lake\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo Thinkpad X131e Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003estout\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIvy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo ThinkCentre Chromebox\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003etidus\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebox\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003etricky\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 11\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ewolf\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 15 (CB5-571)\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eyuna\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebox CB1-(000-099)\u003cbr /\u003e\r\nHP Chromebox G1\u003cbr /\u003e\r\nHP Chromebox for Meetings\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ezako\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\" style\u003d\"margin-left:0pt\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cfont size\u003d\"3\"\u003eThe following list covers affected devices that are End-of-Life as of Chrome OS 65:\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-left:0pt\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-left:0pt\"\u003e\r\n\u003ctable border\u003d\"1\" cellpadding\u003d\"0\" cellspacing\u003d\"0\" dir\u003d\"ltr\" style\u003d\"table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;width:0px;border-collapse:collapse;border:none\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"324\" /\u003e\r\n\u003ccol width\u003d\"118\" /\u003e\r\n\u003ccol width\u003d\"154\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;font-weight:bold\"\u003e\u003cfont size\u003d\"2\"\u003ePlatform\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eHP Pavilion Chromebook 14\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003ebutterfly\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSandy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebook Series 5 550\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003elumpy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSandy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eAcer C7 Chromebook\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eparrot\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSandy Bridge / Ivy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:21px\"\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSamsung Chromebox Series 3\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003estumpy\u003c/font\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom\"\u003e\u003cfont size\u003d\"2\"\u003eSandy Bridge\u003c/font\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-left:0pt\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/meltdown-spectre-vulnerability-status"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3640635051427197487"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1396096524643049009/32"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3640635051427197487"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3640635051427197487"}],"author":[{"name":{"$t":"Jorge Lucangeli Obes"},"email":{"$t":"jorgelo@chromium.org"}}],"sites$pageName":{"$t":"meltdown-spectre-vulnerability-status"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"Xil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/568658652243860188"},"published":{"$t":"2013-03-08T22:34:46.108Z"},"updated":{"$t":"2018-10-29T21:41:03.017Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-29T21:41:01.124Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium OS Board Porting Guide"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Private-Boards-advanced-\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003ePrivate Boards (advanced)\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Naming\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eNaming\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Board-Variants-advanced-\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eBoard Variants (advanced)\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bare-Framework\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eBare Framework\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Architecture\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eArchitecture\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-src-overlays-overlay--BOARD-\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003esrc/overlays/overlay-$BOARD/\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-toolchain.conf\"\u003e\u003cstrong\u003e3.2.1 \u003c/strong\u003etoolchain.conf\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-metadata-layout.conf\"\u003e\u003cstrong\u003e3.2.2 \u003c/strong\u003emetadata/layout.conf\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-base-\"\u003e\u003cstrong\u003e3.2.3 \u003c/strong\u003eprofiles/base/\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-base-make.defaults\"\u003e\u003cstrong\u003e3.2.4 \u003c/strong\u003eprofiles/base/make.defaults\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-base-parent\"\u003e\u003cstrong\u003e3.2.5 \u003c/strong\u003eprofiles/base/parent\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-sub-profile-advanced-\"\u003e\u003cstrong\u003e3.2.6 \u003c/strong\u003eprofiles/\u0026lt;sub-profile\u0026gt;/ (advanced)\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-scripts-advanced-\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003escripts/ (advanced)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-src-third_party-chromiumos-overlay-eclass-cros-board.eclass\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003esrc/third_party/chromiumos-overlay/eclass/cros-board.eclass\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Board-Variant-Framework-advanced-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eBoard Variant Framework (advanced)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Testing-Initial-Build\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eTesting Initial Build\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-make.defaults:-Global-Build-Settings\"\u003e\u003cstrong\u003e6 \u003c/strong\u003emake.defaults: Global Build Settings\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Linux-Kernel-Settings\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eLinux Kernel Settings\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-CHROMEOS_KERNEL_SPLITCONFIG\"\u003e\u003cstrong\u003e6.1.1 \u003c/strong\u003eCHROMEOS_KERNEL_SPLITCONFIG\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-CHROMEOS_KERNEL_ARCH\"\u003e\u003cstrong\u003e6.1.2 \u003c/strong\u003eCHROMEOS_KERNEL_ARCH\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Global-USE-Feature-Selection\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eGlobal USE Feature Selection\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Userland-Device-Driver-Selection\"\u003e\u003cstrong\u003e6.3 \u003c/strong\u003eUserland Device Driver Selection\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-INPUT_DEVICES\"\u003e\u003cstrong\u003e6.3.1 \u003c/strong\u003eINPUT_DEVICES\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-VIDEO_DEVICES\"\u003e\u003cstrong\u003e6.3.2 \u003c/strong\u003eVIDEO_DEVICES\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Global-Compiler-Settings\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eGlobal Compiler Settings\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Compiler-Settings\"\u003e\u003cstrong\u003e7.1 \u003c/strong\u003eCompiler Settings\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-BOARD_COMPILER_FLAGS\"\u003e\u003cstrong\u003e7.1.1 \u003c/strong\u003eBOARD_COMPILER_FLAGS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-CFLAGS\"\u003e\u003cstrong\u003e7.1.2 \u003c/strong\u003eCFLAGS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-CXXFLAGS\"\u003e\u003cstrong\u003e7.1.3 \u003c/strong\u003eCXXFLAGS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-LDFLAGS\"\u003e\u003cstrong\u003e7.1.4 \u003c/strong\u003eLDFLAGS\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Buildbot-Configs\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eBuildbot Configs\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-chromite-buildbot-cbuildbot_config.py\"\u003e\u003cstrong\u003e8.1 \u003c/strong\u003echromite/buildbot/cbuildbot_config.py\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Google-Storage-Integration\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eGoogle Storage Integration\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-googlestorage_account.boto\"\u003e\u003cstrong\u003e9.1 \u003c/strong\u003egooglestorage_account.boto\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-googlestorage_acl.-\"\u003e\u003cstrong\u003e9.2 \u003c/strong\u003egooglestorage_acl.*\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003eYou've got a wonderful new platform that you'd like to run Chromium OS on, but have no idea how to get there from here?  Fret not my fellow traveler, for this document shall be your guide.  We promise it'll be \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ea wondrous and enlightening journey.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003eAn overlay is the set of configuration files that define how the build system will build a Chromium OS disk image.  Configurations will be different depending on the board and architecture type, and what files a developer wants installed on a given disk image.  Every command in the build process takes a required `\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e--board\u003c/span\u003e` parameter, which developers should pass the overlay name to.\u003c/p\u003e\r\n\u003cp\u003eOn your first run through this document for creating your first platform, you can skip the sections labeled \u003ci\u003e(advanced)\u003c/i\u003e.  This will let you focus on the minimum bits to get running, and then you can revisit once you're more comfortable with things.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Private-Boards-advanced-\" /\u003ePrivate Boards \u003ci\u003e(advanced)\u003c/i\u003e\u003c/h3\u003e\r\n\u003cp\u003eThis guide covers doing a public build (one that will be released to the world). There is a \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide/private-boards\"\u003eseparate guide\u003c/a\u003e (meant as an add-on to this one) for creating a private board.  Setting up a private board is useful for when you want to keep your project details a secret before launch, or if your board contains proprietary drivers or firmware that can't be released publicly.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Naming\" /\u003eNaming\u003c/h2\u003e\r\n\u003cp\u003ePossible board names follow a simple specification defined below. Note that this should generally be followed for any new project, as such this encompasses device and model names also, in general any new names that go into the Chromium OS code base.\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003emust have no upper case letters\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003enormalization to lower case keeps things simple\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003emust start with a letter [a-z]\u003c/li\u003e\r\n\u003cli\u003emay contain as many letters [a-z] or numbers [0-9] as you like, but shorter is preferable, people have to type it often\u003c/li\u003e\r\n\u003cli\u003eshould contain no more than one dash\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003etechnically there is no limit, but the more dashes you add, the uglier it gets\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003emust not contain any other character\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ee.g. characters such as, but not limited to, + or % or @ or _ or / or . or : or ... are invalid\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003emust avoid words that are used with generic (board independent) configurations\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ee.g. \"release\" or \"canary\" or \"firmware\" or \"factory\" or \"pfq\" or \"paladin\" or \"incremental\" or \"asan\" or ...\u003c/li\u003e\r\n\u003cli\u003esee \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/chromite.git;a\u003dblob;f\u003dbuildbot/cbuildbot_config.py\"\u003ecbuildbot_config.py\u003c/a\u003e in the chromite repo for more examples (look at the CONFIG constants at the top)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eyou can also run \u003ccode\u003e`cbuildbot -l -a`\u003c/code\u003e to get a feel for the \"group\" names\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould not be generic terms\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ee.g. \"board\" or \"boat\" or \"car\" or \"airplane\" or \"computer\" or ...\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould not be a common name\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ee.g. \"alex\" or \"bob\" or \"caroline\" are examples, as there are real people involved with the projects with these names it makes for awkward conversations about the board\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould be a noun, not an adjective or adverb\u003c/li\u003e\r\n\u003cli\u003eshould be a playful name\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eavoid terms with negative connotations\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould not be very common in the code base to make for easy grepping\u003c/li\u003e\r\n\u003cli\u003eshould be clever\u003c/li\u003e\r\n\u003cli\u003emust not be phonetically similar to an existing board\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eit is not worth the hassle when talking or writing to try and figure out what people mean\u003c/li\u003e\r\n\u003cli\u003eit might make it harder for non-native speakers to differentiate\u003c/li\u003e\r\n\u003cli\u003ee.g. with \"red\" and \"read\", or \"pour\" and \"pored\", or \"accept\" and \"except\", or \"flaunt\" and \"flout\"\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould be pronounceable in conversation\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eno one likes to talk about the XK123A-Z03 board -- that's just boring\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003emust not pick a name that Google intends to use with a Chrome OS board\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003edon't worry, it's unlikely\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eshould not pick a name which would be easily confused with another project\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ee.g. using a name from an Android project (e.g. mako), or a sub component of the OS (e.g. ash) is not advisable\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cp\u003eSettled on a name?  Hopefully it's nifty.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Board-Variants-advanced-\" /\u003eBoard Variants \u003ci\u003e(advanced)\u003c/i\u003e\u003c/h3\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eOften times you will have a base/reference board on which you will build other boards/devices, and you want to customize each in ways that are incompatible with the others.  The board variant framework is designed to handle this setup.  Note: at the moment, the variant framework is only one level deep.  So you cannot do a variant of a variant.  A need for this has not been found, so we haven't worried about it.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003eWhen it comes to naming, you will take the existing reference board name and add on the new project's name separated by an underscore.  Both projects must follow the naming convention laid out in the above section.\u003c/p\u003e\r\n\u003cp\u003eAs an example, Google has a reference board named \u003ccode\u003edaisy\u003c/code\u003e.  Using that base, other board variations have been created such as the \u003ccode\u003esnow\u003c/code\u003e board.  Thus the final board name is \u003ccode\u003edaisy_snow\u003c/code\u003e.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bare-Framework\" /\u003eBare Framework\u003c/h2\u003e\r\n\u003cp\u003eLet's start by laying the ground work for the board.  We won't worry about the fine details (like custom set of packages or flags or ...) at this point.  We just want a board that the build system will recognize and be able to produce a generic set of artifacts.  Once we have that, we'll start customizing things.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Architecture\" /\u003eArchitecture\u003c/h3\u003e\r\n\u003cp\u003eBe aware that we assume your board falls under one of the main (currently supported) architectures:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eamd64 (x86_64) -- 64-bit Intel/AMD processors\u003c/li\u003e\r\n\u003cli\u003earm -- 32-bit ARM processors\u003c/li\u003e\r\n\u003cli\u003earm64 -- 64-bit ARM processors\u003c/li\u003e\r\n\u003cli\u003ex86 (i386/i486/i586/i686) -- 32-bit Intel/AMD/etc... processors\u003c/li\u003e\u003c/ul\u003e\r\nIf you're using a different architecture, please see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-architecture-porting-guide\"\u003eChromium OS Architecture Porting Guide\u003c/a\u003e first.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-src-overlays-overlay--BOARD-\" /\u003esrc/overlays/overlay-$BOARD/\u003c/h3\u003e\r\n\u003cp\u003eThis is the main location for per-board customization.  Let's start off with a simple overlay:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003eoverlay-$BOARD/\u003cbr /\u003e\r\n|-- metadata/\u003cbr /\u003e\r\n|   `-- layout.conf          # Gentoo repo syntatic sugar\u003cbr /\u003e\r\n|-- profiles/\u003cbr /\u003e\r\n|   `-- base/\u003cbr /\u003e\r\n|       |-- make.defaults    # Board customizations (USE/LINUX_FIRMWARE/etc...)\u003cbr /\u003e\r\n|       `-- parent           # Parent profile for this board (common arch/OS settings)\u003cbr /\u003e\r\n`-- toolchain.conf           # Toolchains needed to compile this board\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eMost of these files are one or two lines.  Let's go through them one at a time.\u003c/p\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-toolchain.conf\" /\u003etoolchain.conf\u003c/h4\u003e\r\n\u003cp\u003eFor standard architectures, you only need one line here.  Pick the one that matches the architecture for your board.\u003c/p\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"text-align:center\"\u003e \u003cb\u003earchitecture\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"text-align:center\"\u003e \u003cb\u003etuple\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e amd64 (64-bit)\u003c/td\u003e\r\n\u003ctd\u003e x86_64-cros-linux-gnu\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e arm (armv7)\u003c/td\u003e\r\n\u003ctd\u003e armv7a-cros-linux-gnueabihf\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e arm64 (armv8/aarch64)\u003c/td\u003e\r\n\u003ctd\u003e aarch64-cros-linux-gnu\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e x86 (32-bit)\u003c/td\u003e\r\n\u003ctd\u003e i686-pc-linux-gnu\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003cp\u003eExample file for an x86_64 board:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat toolchain.conf\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003ex86_64-cros-linux-gnu\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eNote that if you do need more than one toolchain, you can list as many as you like (one per line). But the first entry must be the default one for your board.\u003c/p\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-metadata-layout.conf\" /\u003emetadata/layout.conf\u003c/h4\u003e\r\n\u003cp\u003eDon't worry about the content of this file.  Simply copy \u0026amp; paste what you see below, and then update the \u003ccode\u003erepo-name\u003c/code\u003e field to match your $BOARD.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat metadata/layout.conf\u003cbr /\u003e\r\nmasters \u003d portage-stable chromiumos eclass-overlay\u003cbr /\u003e\r\nprofile-formats \u003d portage-2\u003cbr /\u003e\r\nrepo-name \u003d \u003cb\u003elumpy\u003c/b\u003e\u003cbr /\u003e\r\nthin-manifests \u003d true\u003cbr /\u003e\r\nuse-manifests \u003d strict\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-base-\" /\u003eprofiles/base/\u003c/h4\u003e\r\n\u003cp\u003eThis is the \"base\" profile (aka the default) for your board.  It allows you to customize a wide array of settings.\u003c/p\u003e\r\n\u003cp\u003eThis is where the majority of board customization happens -- USE customizations across all packages in \u003ccode\u003emake.defaults\u003c/code\u003e, or USE and KEYWORDS on a per-package basis (via the \u003ccode\u003epackage.use\u003c/code\u003e and \u003ccode\u003epackage.keywords\u003c/code\u003e files respectively). See the portage(5) man page for all the gory details.\u003c/p\u003e\r\n\u003cp\u003eBy using the profile, stacking behavior across other profiles is much easier to reason about (when talking about chipsets, baseboards, projects, etc...).\u003c/p\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-base-make.defaults\" /\u003eprofiles/base/make.defaults\u003c/h4\u003e\r\n\u003cp\u003eThis file can be used to customize global settings for your board.  In this first go, we'll use a standard form.  New content later on should be appended to this.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Initial value just for style purposes.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eUSE\u003d\"\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eLINUX_FIRMWARE\u003d\"\"\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# Custom optimization settings for C/C++ code.\u003cbr /\u003e\r\nBOARD_COMPILER_FLAGS\u003d\"\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-base-parent\" /\u003eprofiles/base/parent\u003c/h4\u003e\r\n\u003cp\u003eThis will vary based on your architecture.\u003c/p\u003e\r\n\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"text-align:center\"\u003e\u003cb style\u003d\"text-align:center\"\u003earchitecture\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"text-align:center\"\u003e\u003cb\u003eparent profile\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e amd64\u003c/td\u003e\r\n\u003ctd\u003echromiumos:default/linux/\u003ci\u003eamd64\u003c/i\u003e/10.0/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e arm\u003c/td\u003e\r\n\u003ctd\u003echromiumos:default/linux/\u003ci\u003earm\u003c/i\u003e/10.0/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e arm64\u003c/td\u003e\r\n\u003ctd\u003echromiumos:default/linux/\u003ci\u003earm64\u003c/i\u003e/10.0/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e x86\u003c/td\u003e\r\n\u003ctd\u003echromiumos:default/linux/\u003ci\u003ex86\u003c/i\u003e/10.0/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\u003cp\u003eExample file for an x86_64 board:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat profiles/base/parent\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003echromiumos:default/linux/amd64/10.0/chromeos\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-sub-profile-advanced-\" /\u003eprofiles/\u0026lt;sub-profile\u0026gt;/ (\u003ci\u003eadvanced)\u003c/i\u003e\u003c/h4\u003e\r\n\u003cp\u003eSometimes you will want to take an existing board and try out some tweaks on it.  Perhaps you want to use a different kernel, or change one or two USE flags, or use a different compiler settings (like more debugging or technology like ASAN).  You could create a board variant, but that is more for different boards, and is much more heavy handed.\u003c/p\u003e\r\n\u003cp\u003eTo create a sub-profile, simply make a new directory under the profiles/ and name it whatever you like.  Many Google based systems have one called \u003ccode\u003ekernel-next\u003c/code\u003e and we use this to easily test the new development kernel tree.\u003c/p\u003e\r\n\u003cp\u003eYou should then create a \u003ccode\u003eparent\u003c/code\u003e file in there like so:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat profiles/kernel-next/parent\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e../base\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eThis says the sub-profile will start off using the existing base profile (so you don't have to duplicate all the settings you've already put into that directory).  From here, you can add any files like you would any other profile directory.\u003c/p\u003e\r\n\u003cp\u003eNow to select this new profile, you use the \u003ccode\u003e--profile\u003c/code\u003e option when running \u003ccode\u003esetup_board\u003c/code\u003e.  You can either blow away the existing build dir (if one exists), or tell the system to simply rewrite the configs to point to the new profile.  You'll have to make the decision using your knowledge of the profile (whether it means a lot of changes or just swapping of one or two packages).\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# Recreate from scratch.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e$ ./setup_board --profile\u003dkernel-next --board\u003dlumpy --force\u003cbr /\u003e\r\n\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Or just rewrite the configs to use the new profile.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e$ ./setup_board --profile\u003dkernel-next --board\u003dlumpy --regen_configs\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-scripts-advanced-\" /\u003e\u003cfont size\u003d\"2\"\u003escripts/ (advanced)\u003c/font\u003e\u003c/h3\u003e\r\n\u003cdiv\u003eThis folder contains scripts used during \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:10pt;background-color:transparent\"\u003ebuild_image\u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e, to tweak the packages that are allowed on the final image. The scripts of interest here are \u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small;font-family:monospace;background-color:transparent\"\u003ebuild_kernel_image.sh -- Sourced by the main build_kernel_image.sh script for board specific modifications.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small;font-family:monospace;background-color:transparent\"\u003eboard_specific_setup.sh -- Sourced by the main build_image.sh script for board specific modifications.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small;font-family:monospace;background-color:transparent\"\u003edisk_layout.json -- Used by boards that need a different disk partition than the default one.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-src-third_party-chromiumos-overlay-eclass-cros-board.eclass\" /\u003esrc/third_party/chromiumos-overlay/eclass/cros-board.eclass\u003c/h3\u003e\r\n\u003cp\u003eSince we need some central location to store all the possible board names, we have the cros-board.eclass.  It should be pretty self-explanatory.\u003c/p\u003e\r\n\u003cp\u003eWe actively welcome commits to this file.  Simply upload a CL to gerrit that adds your fun board and we'll gladly take a look for you.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Board-Variant-Framework-advanced-\" /\u003eBoard Variant Framework \u003ci\u003e(advanced)\u003c/i\u003e\u003c/h2\u003e\r\n\u003cp\u003eNote: No new boards should use the variant framework.  Instead they should use the arbitrary overlay stacking system (where we have chipsets, baseboards, projects, etc...).\u003c/p\u003e\r\n\u003cp\u003eRather than create an entire hardware board from scratch every time a new project comes along, companies will often take existing projects and make tweaks to fit the new one.  It's a common industry practice which allows for rapid expansion into more areas.  Since these boards are pretty close to each other, it'd be annoying to have to duplicate the entire board settings just to make a handful of changes.  The variant framework was designed to address this.\u003c/p\u003e\r\n\u003cp\u003eBasically, refer to the sections above for creating a new board overlay.  However, this time name it slightly different.  If the base board is named \u003ccode\u003edaisy\u003c/code\u003e and the variant is named \u003ccode\u003esnow\u003c/code\u003e, we would create the directory \u003ccode\u003eoverlay-variant-daisy-snow\u003c/code\u003e.  Yes, the separator is now a dash rather than an underscore.\u003c/p\u003e\r\n\u003cp\u003eYou will still need to create at least these files (see the previous section for what to put into them):\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cli\u003e\u003ccode\u003emetadata/layout.conf\u003c/code\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eUsually you can just copy the version verbatim from the parent board and update the \u003ccode\u003erepo-name\u003c/code\u003e field\u003c/li\u003e\u003c/ul\u003e\r\nThe base board overlay will be set as the parent of this variant automatically.  So settings/packages that exist in there will be the starting point for this variant.\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-Initial-Build\" /\u003eTesting Initial Build\u003c/h2\u003e\r\n\u003cp\u003eSince your board should be all set up and ready to go, let's test it.  All operations will be done inside the chroot (so run `cros_sdk` to get in first).\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003cfont style\u003d\"color:rgb(153,0,255)\"\u003e\u003ccode\u003e$ ./setup_board --board\u003d$BOARD\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u0026lt;random build output\u0026gt;\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e$ ./build_packages --board\u003d$BOARD\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u0026lt;lots of build output\u0026gt;\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eThose should both have worked and produced a generic build for that architecture (using your $BOARD name).  Let's set about customizing the build now.\u003c/p\u003e\r\n\u003cp\u003eNote: as you make changes below to your overlay, re-running \u003ccode\u003ebuild_packages\u003c/code\u003e again will rebuild packages that have changed based on your USE flags.  But other changes (like compiler settings or kernel configs) will not trigger automatic rebuilds.  Only new package builds will use the new settings.  Once you're happy with all your settings though, you can re-run \u003ccode\u003esetup_board\u003c/code\u003e with the \u003ccode\u003e--force\u003c/code\u003e flag.  Then running \u003ccode\u003ebuild_packages\u003c/code\u003e will build everything from scratch with the latest settings.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-make.defaults:-Global-Build-Settings\" /\u003emake.defaults: Global Build Settings\u003c/h2\u003e\r\n\u003cp\u003eThis file contains a few key variables you'll be interested in.  Since each of these can be a large topic all by themselves, this is just an overview.\u003c/p\u003e\r\n\u003cp\u003eYou can set variables like you would in a shell script (\u003ccode\u003eVAR\u003d\"value\"\u003c/code\u003e), as well as expand them (\u003ccode\u003eFOO\u003d\"${VAR} foo\"\u003c/code\u003e).  But do not try to use shell commands like \u003ccode\u003eif [...]; then\u003c/code\u003e or sub-shells like \u003ccode\u003e$(...)\u003c/code\u003e or \u003ccode\u003e`...`\u003c/code\u003e as things will fail.\u003c/p\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"text-align:center;width:326px;height:15px\"\u003e\u003cb\u003eSetting\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"text-align:center;width:678px;height:15px\"\u003e\u003cb\u003eMeaning\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e CHROMEOS_KERNEL_SPLITCONFIG\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e The kernel defconfig to start with\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e CHROMEOS_KERNEL_ARCH\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e The kernel $ARCH to use (normally you do not need to set this)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e USE\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e Global control of features (e.g. alsa or ldap or opengl or sse or ...)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e INPUT_DEVICES\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e List of drivers used for input (e.g. keyboard or mouse or evdev or ...)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e VIDEO_CARDS\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e List of drivers used for video output (e.g. intel or armsoc or nouveau or ...)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e BOARD_COMPILER_FLAGS\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e The common set of compiler flags used to optimize for your processor (e.g. -mtune/-march)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e CFLAGS\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e Compiler flags used to optimize when building C code\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e CXXFLAGS\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e Compiler flags used to optimize when building C++ code\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:326px;height:15px\"\u003e LDFLAGS\u003c/td\u003e\r\n\u003ctd style\u003d\"width:678px;height:15px\"\u003e Linker flags used to optimize when linking objects (normally you do not need to set this)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Linux-Kernel-Settings\" /\u003eLinux Kernel Settings\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-CHROMEOS_KERNEL_SPLITCONFIG\" /\u003eCHROMEOS_KERNEL_SPLITCONFIG\u003c/h4\u003e\r\n\u003cp\u003eThe kernel is automatically compiled \u0026amp; installed by the build system.  In order to configure it, you have to start with a defconfig file as the base (it can later be refined by various USE flags).  This value allows you to control exactly that.\u003c/p\u003e\r\n\u003cp\u003eYou can specify the relative path (to the root of the kernel tree) to your defconfig.  This is useful if you are using a custom kernel tree rather than the official Chromium OS Linux kernel tree.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e$ grep CHROMEOS_KERNEL_CONFIG profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eCHROMEOS_KERNEL_CONFIG\u003d\"arch/arm/configs/bcmrpi_defconfig\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eOr you can specify a Chromium OS config base.  We have one for each major platform/SoC that ships in an official Chrome OS device, and we have architecture generic configs.  You can find the full list by browsing the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/kernel/+/master/chromeos/config/\"\u003echromeos/config/ directory in the kernel tree\u003c/a\u003e.  Unlike a defconfig, splitconfigs are much smaller fragments which start with a common base and then enable/disable a few options relative to that.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e$ grep \u003c/code\u003e\u003ccode\u003eCHROMEOS_KERNEL_SPLITCONFIG profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003cfont size\u003d\"2\"\u003e\u003ccode\u003eCHROMEOS_KERNEL_SPLITCONFIG\u003d\"\u003c/code\u003e\u003c/font\u003e\u003ccode\u003echromeos-pinetrail-i386\u003c/code\u003e\u003cfont size\u003d\"2\"\u003e\u003ccode\u003e\"\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-CHROMEOS_KERNEL_ARCH\" /\u003eCHROMEOS_KERNEL_ARCH\u003c/h4\u003e\r\n\u003cp\u003eThe kernel build system normally detects what architecture you're using based on your overall profile.  For example, if you have an amd64 board overlay setup, the build knows it should use ARCH\u003dx86_64.\u003c/p\u003e\r\n\u003cp\u003eHowever, there arises edge cases where you want to run a kernel architecture that is different from the userland.  For example, say you wanted to run a 64-bit x86_64 kernel, but you wanted to use a 32-bit i386 userland.  If your profile is normally setup for an x86 system, you can set this variable to x86_64 to get a 64-bit kernel.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e$ grep CHROMEOS_KERNEL_ARCH profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eCHROMEOS_KERNEL_ARCH\u003d\"x86_64\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Global-USE-Feature-Selection\" /\u003eGlobal USE Feature Selection\u003c/h3\u003e\r\n\u003cp\u003eOne of the strengths of the Gentoo distribution is that you can easily control general feature availability in your builds by changing your USE settings.  For example, if you don't want audio, you can disable alsa \u0026amp; oss.  Or if you don't want \u003ca href\u003d\"http://en.wikipedia.org/wiki/LDAP\" rel\u003d\"nofollow\"\u003eLDAP\u003c/a\u003e, you can disable that.  All of the ebuild files (the package scripts used to build/install code) have logic to check each setting that is optional so you don't have to.\u003c/p\u003e\r\n\u003cp\u003eThe downside, as you can imagine, is that with thousands and thousands of packages, the number of possible USE flags is vast.  There are also some optional settings which only make sense with one or two packages (global vs local USE flags).  So weeding through which USE flags exactly matter can be a bit of a monstrous task.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Userland-Device-Driver-Selection\" /\u003eUserland Device Driver Selection\u003c/h3\u003e\r\n\u003cp\u003eAn extension to the USE flag system are so called USE-expanded variables.  This helps reduce the global USE flag noise a bit by having specially named variables with specific meaning.  In this case, we'll discuss device inputs (keyboards/mouse/etc...) and video outputs.\u003c/p\u003e\r\n\u003cp\u003eThe exact driver availability (and naming convention) depends on what graphic system you intend to use.  The X project tends to have the widest selection but is a larger overall install size, while DirectFB tends to have smaller selection of drivers but be much smaller.  We'll focus on X here as that is the main system that Chromium supports.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-INPUT_DEVICES\" /\u003eINPUT_DEVICES\u003c/h4\u003e\r\n\u003cdiv\u003eTBD\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-VIDEO_DEVICES\" /\u003eVIDEO_DEVICES\u003c/h4\u003e\r\n\u003cdiv\u003eTBD\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Global-Compiler-Settings\" /\u003eGlobal Compiler Settings\u003c/h2\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Compiler-Settings\" /\u003eCompiler Settings\u003c/h3\u003e\r\n\u003cp\u003eEveryone likes optimizations.  Faster is better, right?  Here's the nuts and bolts of it.\u003c/p\u003e\r\n\u003cp\u003eWhile picking out flags to use, keep in mind that Chromium OS uses \u003ca href\u003d\"https://clang.llvm.org/\" rel\u003d\"nofollow\"\u003eLLVM/Clang\u003c/a\u003e for its compiler suite.  It also uses the \u003ca href\u003d\"http://en.wikipedia.org/wiki/Gold_(linker)\" rel\u003d\"nofollow\"\u003egold linker\u003c/a\u003e.  So see the respective documentation.\u003c/p\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-BOARD_COMPILER_FLAGS\" /\u003eBOARD_COMPILER_FLAGS\u003c/h4\u003e\r\n\u003cp\u003eYou should put compiler optimizations that target your specific cpu into this variable.  Commonly, this means:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003e-march\u003d\u0026lt;arch\u0026gt; -- see the \u003ca href\u003d\"http://gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html\" rel\u003d\"nofollow\"\u003eGCC manual\u003c/a\u003e for complete lists of possible values here\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eThis selects the minimum \u003cb\u003erequired\u003c/b\u003e processor/architecture that the code will run on\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003earmv7-a\u003c/i\u003e is common for ARMv7 parts\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003ecore2\u003c/i\u003e is common for Intel Core2 parts\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003ecorei7\u003c/i\u003e is common for Intel Core i7 parts\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e-mtune\u003d\u0026lt;arch\u0026gt; -- see the \u003ca href\u003d\"http://gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html\" rel\u003d\"nofollow\"\u003eGCC manual\u003c/a\u003e for complete lists of possible values here\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eThis selects the processor that the code will be optimized best for without requiring it\u003c/li\u003e\r\n\u003cli\u003eIf you don't specify this, then the -march setting will be used\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003ecortex-a8\u003c/i\u003e or \u003ci\u003ecortex-a9\u003c/i\u003e or \u003ci\u003ecortex-a15\u003c/i\u003e are common for ARM parts\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e-mfpu\u003d\u0026lt;fpu\u0026gt; (ARM only)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eTypical values are neon and vfpv3-d16\u003c/li\u003e\r\n\u003cli\u003eIf you have an ARMv7, pick between these two values\u003c/li\u003e\r\n\u003cli\u003eIf you don't have an ARMv7, then you should already know the answer to this question :)\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e-mfloat-abi\u003dhard (ARM only)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eKeep in mind that Chromium OS assumes you are using the hard float ABI.  While it is certainly possible to get things working with a soft float ABI, you shouldn't waste your time.  Join us in the future and migrate away from the old \u0026amp; slow soft float ABI (this also includes the softfp ABI -- it's just as bad).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e-mmmx / -msse / -msse2 / etc...\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eThere are a variety of machine-specific optimization flags that start with -m that you might want to try out\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-CFLAGS\" /\u003eCFLAGS\u003c/h4\u003e\r\n\u003cp\u003eIf you have flags that you want to use only when compiling C code, use this variable.  Otherwise, things will default to \u003ccode\u003e-O2 -g -pipe\u003c/code\u003e.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ grep CFLAGS profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eCFLAGS\u003d\"-march\u003dfoo\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-CXXFLAGS\" /\u003eCXXFLAGS\u003c/h4\u003e\r\n\u003cp\u003eIf you have flags that you want to use only when compiling C++ code, use this variable.  Otherwise, things will default to \u003ccode\u003e-O2 -g -pipe\u003c/code\u003e.\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e$ grep CXXFLAGS profiles/base/make.defaults\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eCXXFLAGS\u003d\"-march\u003dfoo\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-LDFLAGS\" /\u003eLDFLAGS\u003c/h4\u003e\r\n\u003cp\u003eIf you have flags that you want to send directly to the linker for all links, use this variable.\u003c/p\u003e\r\n\u003cp\u003eThese should take the form as given to the compiler driver.  i.e. use \u003ccode\u003e-Wl,-z,relro\u003c/code\u003e rather than \u003ccode\u003e-z relro\u003c/code\u003e.\u003c/p\u003e\r\n\u003cp\u003eYou can find common settings in the \u003ca href\u003d\"http://sourceware.org/binutils/docs/ld/Options.html\" rel\u003d\"nofollow\"\u003eGNU Linker manual\u003c/a\u003e.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Buildbot-Configs\" /\u003eBuildbot Configs\u003c/h2\u003e\r\n\u003cp\u003ePresumably you'd like to be able to easily (and cleanly) produce artifacts for your board. In our \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite\"\u003echromite repo\u003c/a\u003e, we have a tool called \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/scripts/cbuildbot.py\"\u003ecbuildbot\u003c/a\u003e that takes care of all that for us. Normally it's run by \u003ca href\u003d\"http://buildbot.net/\" rel\u003d\"nofollow\"\u003ebuildbot\u003c/a\u003e on a \u003ca href\u003d\"http://build.chromium.org/p/chromiumos/waterfall\"\u003ewaterfall\u003c/a\u003e to produce all the goodness, but there's no requirement that buildbot be the tool you use. You can even \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/build/local-trybot-documentation\"\u003erun it locally\u003c/a\u003e.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-chromite-buildbot-cbuildbot_config.py\" /\u003echromite/buildbot/cbuildbot_config.py\u003c/h3\u003e\r\n\u003cp\u003eAt any rate, you'll need to update this \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/cbuildbot/cbuildbot_config.py\"\u003emaster file\u003c/a\u003e to add your new board configs. There are a few classes of configs to be familiar with:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e$BOARD-paladin: used by the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:359411dde4d9a4a3\" class\u003d\"disabled\"\u003eChromium OS CQ\u003c/a\u003e -- not needed if you aren't an official Chrome OS device\u003c/li\u003e\r\n\u003cli\u003e$BOARD-full: a public build of the build\u003c/li\u003e\r\n\u003cli\u003e$BOARD-release: a private build of the board\u003c/li\u003e\r\n\u003cli\u003e$BOARD-firmware: build just the firmware (bootloader/etc...) for the board\u003c/li\u003e\r\n\u003cli\u003e$BOARD-factory: build the factory install shim -- used to create an image for programming devices in the factory/RMA/etc...\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eThe file should be largely self-documenting.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Google-Storage-Integration\" /\u003eGoogle Storage Integration\u003c/h2\u003e\r\n\u003cp\u003eSometimes you'll want to host large files or prebuilt binary packages for your repo, but you don't want to give out access to everyone in the world. You can great some boto config files, and the build scripts will automatically use them when they're found.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-googlestorage_account.boto\" /\u003egooglestorage_account.boto\u003c/h3\u003e\r\n\u003cp\u003eCreate this file in the root of the overlay. This file stores the access credential (in cleartext) for the role account.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-googlestorage_acl.-\" /\u003egooglestorage_acl.*\u003c/h3\u003e\r\n\u003cp\u003eThese are the ACL files used by gsutil to apply access for people. Used whenever you want to upload files and grant access to people who have the boto file.\u003c/p\u003e\r\n\u003cp\u003eThe TXT format is documented in the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/gsutil.md#installing-gsutil\"\u003egsutil FAQ\u003c/a\u003e. The JSON format is not yet used. Support for the XML format has been dropped.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/568658652243860188"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/568658652243860188"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/568658652243860188"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"chromiumos-board-porting-guide"},"sites$revision":{"$t":"37"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8391995747890207487"},"published":{"$t":"2013-08-30T17:11:46.620Z"},"updated":{"$t":"2018-10-29T21:40:16.967Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-07-28T18:18:05.009Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Infrastructure Components"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eDocumentation about each of the chromeOS autotest infrastructure components can be found here.  The components are grouped into 2 categories: those that are \"core\" pieces of the infrastructure, such as the scheduler, dev servers, and results database; and those that are \"auxiliary\" pieces of infrastructure, such as monitoring and bug-filing systems.\u003cdiv\u003e(\u003cfont color\u003d\"#990000\"\u003e\u003cb\u003e*\u003c/b\u003e\u003c/font\u003e \u003d internal to Google only)\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eCore Infrastructure Components\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eScheduler [\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/autotest-scheduler\" rel\u003d\"nofollow\"\u003eserver admin\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e) | \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:1fa1705d4ce1574a\" class\u003d\"disabled\"\u003edesign doc\u003c/a\u003e]\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/dev-server\" rel\u003d\"nofollow\"\u003eDev server\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/autotest-drones\" rel\u003d\"nofollow\"\u003eDrones\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/dhcp-server\" rel\u003d\"nofollow\"\u003eDHCP server\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/golo-proxy\" rel\u003d\"nofollow\"\u003eGolo proxy\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/dns-server\" rel\u003d\"nofollow\"\u003eDNS server\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/puppet\" rel\u003d\"nofollow\"\u003ePuppet\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/database\" rel\u003d\"nofollow\"\u003eDatabase\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/rpm-server\" rel\u003d\"nofollow\"\u003eRPM server\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eAuxiliary Infrastructure\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eMonitoring systems [\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/monitoring-systems\" rel\u003d\"nofollow\"\u003eserver admin\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e) | \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:3bd0028403c6aa7e\" class\u003d\"disabled\"\u003egraphite\u003c/a\u003e]\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/autotest-development-test-machines\" rel\u003d\"nofollow\"\u003eAutotest development test machines\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/bug-filing-system\" rel\u003d\"nofollow\"\u003eBug filing system\u003c/a\u003e (\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:103ab191c6345588\" class\u003d\"disabled\"\u003eAFE RPC infrastructure\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:3172d2438d86e10e\" class\u003d\"disabled\"\u003eAutoserv packaging\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/infrastructure-components/keyvals\"\u003eKeyvals\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:204c2e353f11b52b\" class\u003d\"disabled\"\u003eGS offloader\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/gsutil-setup\" rel\u003d\"nofollow\"\u003eGsutil setup\u003c/a\u003e\u003c/li\u003e\u003cli\u003ePerf dashboard uploader: [\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1zykB3eO9rXSCAv6czoha-CL8yvH4mg6GyRtaJuVOefo/edit?usp\u003dsharing\"\u003euser guide\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e) | \u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1jUe4PXCCaj1_rII7_J4uu8mLwRgglljEvCH_ssd057s/edit?usp\u003dsharing\"\u003edeveloper guide\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)]\u003c/li\u003e\u003cli\u003eTest health monitoring [\u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/test-health-monitoring\" rel\u003d\"nofollow\"\u003euser guide\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e) | \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/for-team-members/lab2/infrastructure-components/test-health-monitoring/test-health-monitoring-developer-guide\" rel\u003d\"nofollow\"\u003edeveloper guide\u003c/a\u003e(\u003cb style\u003d\"color:rgb(153,0,0)\"\u003e*\u003c/b\u003e)]\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/infrastructure-components"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8391995747890207487"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8391995747890207487"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8391995747890207487"}],"author":[{}],"sites$pageName":{"$t":"infrastructure-components"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3996868104461086837"},"published":{"$t":"2013-01-11T20:22:23.450Z"},"updated":{"$t":"2018-10-29T21:38:24.384Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-29T21:38:22.033Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Test Lab Setup"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page will walk you through duplicating the majority of the test lab set up that Chrome OS runs internally to validate builds on real hardware.\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eYou will need:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eA linux machine for running the multiple servers required.\u003c/li\u003e\u003cul\u003e\u003cli\u003eNote you can run them all on one machine or multiple in order to scale and spread load.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eA Chromiumos checkout\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/quick-start-guide\"\u003ehttp://www.chromium.org/test lab setup (i.e. Autotest Server and Devserver)chromium-os/quick-start-guide\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eA Chrome OS Device.\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-SSH-Access-to-your-test-device.\" /\u003eSetting up SSH Access to your test device.\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eIn order to run the automated tests against your device you need to ensure it is running a Test Image and you have password-less SSH Access.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePlease follow: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/ssh-test-keys-setup\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/ssh-test-keys-setup\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-an-Autotest-Server-and-Web-Frontend\" /\u003eSetting up an Autotest Server and Web Frontend\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eAutotest is the software that is used to run the tests on devices and also collect the results.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePlease follow to install and configure the tools:\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/setup-autotest-server\"\u003ehttps://sites.google.com/a/ch romium.org/dev/chromium-os/testing/autotest-developer-faq/setup-autotest-server\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAfter this is complete you should have an Autotest Frontend (AFE) running on your server, please go to \u003ca href\u003d\"http://localhost\" rel\u003d\"nofollow\"\u003ehttp://localhost\u003c/a\u003e to verify.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-the-Autotest-Server\" /\u003eUsing the Autotest Server\u003c/h2\u003e\u003cdiv\u003eNow that you have set up the Autotest Server, you need to import your tests, add test hosts and launch the scheduler. Please refer to \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/autotest-server-usage\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq/autotest-server-usage\u003c/a\u003e for more information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote: At this point you can run tests through the Web Interface. However you lack the ability to automatically have your devices be re-imaged by the test servers. The following steps will setup a Devserver to stage test images from Google Storage so that you can do automated updates. This process is currently for Internal Google Use and our Partners. If you are a Partner, please contact your Google Representative about requesting access to our images.\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Devserver-Prerequisites\" /\u003eDevserver Prerequisites\u003c/h2\u003e\u003cdiv\u003eOur images are stored in Google Storage and first you need to setup your machine to give you access to these builds.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eYou will need:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli style\u003d\"list-style-position:outside;list-style-type:square\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePython modules: CherryPy and lockfile\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-position:outside;list-style-type:square\"\u003e\u003cb\u003eapt-get install python-cherrypy3 python-lockfile\u003c/b\u003e, or easy_install -U cherrypy3 lockfile\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/gsutil.md#installing-gsutil\"\u003egsutil installed\u003c/a\u003e\u003c/li\u003e\u003cli\u003eA .boto file in your home directory\u003c/li\u003e\u003cul\u003e\u003cli\u003eRun `gsutil config`\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003eIf you are a Chrome OS Googler you can verify everything is setup by running `gsutil ls gs://chromeos-image-archive` if you are an external partner test with the bucket you have been supplied.\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Devserver-Setup\" /\u003eDevserver Setup\u003c/h2\u003e\u003cdiv\u003e*After you have installed the above dependencies:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003ecd [Your Chromium OS Checkout]/src/platform/dev\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e./devserver.py -t --production --archive_dir /some/path/images\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eExplanation of options above:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul style\u003d\"line-height:20px\"\u003e\u003cli style\u003d\"list-style-position:outside;list-style-type:square\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e-t - This tells the devserver to serve test images. If you do not want to serve test images leave this option off. For a lab set up test images are required\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-position:outside;list-style-type:square\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e--production - This increases the server thread pool for cherrypy. Again if you are not expecting any sort of load on this server this is unnecessary\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-position:outside;list-style-type:square\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e--archive_dir -  The directory where all images are stored that are staged by the devserver. \u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv style\u003d\"line-height:20px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAfter running the above command you will see some information printed out by cherrypy and you should be able to browse to\u003ci\u003ehttp://server_hostname:8080\u003c/i\u003e. There you will see a short index of the different operations that can be carried out similar to what is summarized in the \"Services Provided by Devserver\" paragraph above.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:20px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2 style\u003d\"line-height:20px\"\u003e\u003ca name\u003d\"TOC-Running-Test-Suites\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRunning Test Suites\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNow that everything is configured please refer to the Test Suite Documentation on how to the \"lab\" you just set up. You will likely want to pay attention to the sections involving test_that and run_suite.py\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-suites\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-suites\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(40,55,105);font-family:Droid Sans,serif;line-height:20px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-lab-setup"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3996868104461086837"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3996868104461086837"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3996868104461086837"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"test-lab-setup"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2056377352324839431"},"published":{"$t":"2009-11-19T17:03:13.802Z"},"updated":{"$t":"2018-10-25T18:18:00.059Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-25T18:17:58.305Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Partition Resizing"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Abstract\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eAbstract\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Use-case\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eUse case\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Partition-layout\"\u003e\u003cstrong\u003e3 \u003c/strong\u003ePartition layout\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Procedure-for-resizing-partitions\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eProcedure for resizing partitions\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-When-does-resizing-occur-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eWhen does resizing occur?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003cdiv style\u003d\"text-align:center\"\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eNote: This is a proposal that has never shipped.\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003eAbstract\u003c/h2\u003e\r\n\u003cdiv\u003eChromium OS will be able to resize partitions without erasing them, easing delivery of system updates.\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Use-case\" /\u003eUse case\u003c/h2\u003e\r\nA big new operating system release is on the way, and it needs more system space than the current system partitions have. We can push an update that makes the system partitions bigger (by shrinking the stateful partition); then when the big new release arrives, enough space is available on the disk.\u003cbr /\u003e\r\n\r\n\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Partition-layout\" /\u003e Partition layout\u003c/h2\u003e\r\nA drive currently contains up to four partitions, in the following order:\u003cbr /\u003e\r\n\u003col\u003e\u003cli\u003eOne\r\npartition for state resident on the drive, called the \"stateful partition.\" Any space required in the stateful partition is\r\npre-allocated by the system. For example, a large file\r\nwill be allocated for the autoupdater to use to store downloaded updates.\u003c/li\u003e\r\n\u003cli\u003eAn optional swap partition.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eTwo partitions for the root file system. For more information, see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/filesystem-autoupdate\"\u003eFile System/Autoupdate\u003c/a\u003e document.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\nIn the future, drives may be able to have more partitions, as needed.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Procedure-for-resizing-partitions\" /\u003eProcedure for resizing partitions\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cdiv\u003e The following diagram shows all the steps that must occur to resize partitions and leave them in the desired state.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nKeep in mind that at any point the system may be\r\nunexpectedly rebooted, and the OS must recover gracefully (in particular, it must not\r\nbrick). Also, keep in mind that the OS doesn't allow changing the\r\ncontents or location of the partition we booted into.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe following procedure assumes that at the start of the process, the system has booted into the last partition on the disk. If, instead, the system is currently booted into the second-to-last partition, then the partition-resizing process usually waits to begin until the next update or reboot occurs naturally. However, if the resizing is urgent, the system can copy the A partition into B and then reboot before starting the illustrated procedure.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIf there's a swap partition, it isn't resized.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nNote that, at the end of the following process, the A and B partitions are always the same size as each other.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"http://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/partition-resizing/resize_partition.png?attredirects\u003d0\" imageanchor\u003d\"1\" rel\u003d\"nofollow\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258650195034/chromium-os/chromiumos-design-docs/partition-resizing/resize_partitionpng\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-When-does-resizing-occur-\" /\u003eWhen does resizing occur?\u003cbr /\u003e\r\n\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\r\n Partition resizing is initiated by the system, not by the user.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nSome notes:\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eThe approach described in this document depends on ext4 being able to make the stateful partition smaller.\u003c/li\u003e\r\n\u003cli\u003eIf the stateful partition contains a lot of data, it may\r\nnot always be possible to resize it down to the desired size; in that\r\ncase the system will have to delete state information before resizing.\u003c/li\u003e\r\n\u003cli\u003eThe resizing process currently assumes that the machine can't be used while partitions are being resized. Therefore, during the time while the system is shrinking\r\nthe stateful partition, the user will have to leave the machine turned on but won't be able to use it. The system will display a \"working...please wait\" message on the screen.\u003c/li\u003e\r\n\u003cli\u003eOpen issue: Will ext4 support resizing partitions while the file system is mounted? If it does, then we may be able to allow the user\r\nto use the machine while resizing partitions.\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\nNote that, to support encrypted home\r\ndirectories, we will already have to have a \"working...please wait\"\r\nmessage on the screen at logout when we re-sparsify the home directory.\r\nThis would be an appropriate time to resize the stateful partition file system\r\nif needed.\u003cbr /\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/partition-resizing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2056377352324839431"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2056377352324839431"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2056377352324839431"}],"author":[{}],"sites$pageName":{"$t":"partition-resizing"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"Xil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1002338444018869319"},"published":{"$t":"2017-01-30T15:56:04.392Z"},"updated":{"$t":"2018-10-18T15:18:32.349Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-24T20:43:16.156Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Servicification"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Summary\" /\u003eSummary\u003c/h2\u003e\u003cdiv\u003eThe Chromium codebase now supports many platforms and use cases. In response, we need to migrate the code base to a more modular, service-oriented architecture. \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis will produce reusable and decoupled components while also reducing duplication. It also allows the Chrome team and other groups to experiment with new features without needing to modify Chrome.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eContact\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003emailing list: \u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/services-dev\"\u003eservices-dev@chromium.org\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/15I7sQyQo6zsqXVNAlVd520tdGaS8FCicZHrN0yRu-oU/edit#\"\u003edesign doc\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://drive.google.com/file/d/0BwPS_JpKyELWN3BHSFRicEJ0SDg/view\"\u003epresentation\u003c/a\u003e \u0026amp; \u003ca href\u003d\"http://go/servicification-presentation\" rel\u003d\"nofollow\"\u003eslide deck\u003c/a\u003e (both internal only)\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/servicification.md\"\u003ehow to create a service\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1AjTsDoY6ugaykfqGLyOHYfp67hMp0tMjDbZcJ5EH9fw/edit#heading\u003dh.otewm6d8oykp\"\u003eMandoline\u003c/a\u003e: experimental browser that we prototyped these ideas in\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Major-projects\" /\u003eMajor projects\u003c/h2\u003e\u003cdiv\u003eAs part of this effort, we are refactoring existing components of Chromium into isolated services. Here are some of the major projects underway:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eUI Service\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://www.chromium.org/developers/mus-ash\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eUI \u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e(aka MUS)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003emailing list: \u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/mustash-dev\"\u003emustash-dev@chromium.org\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eNetwork Service\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1wAHLw9h7gGuqJNCgG1mP1BmLtCGfZ2pys-PdZQ1vg7M/edit\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eNetwork\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003emailing list: \u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/network-service-dev\" style\u003d\"background-color:transparent;font-size:10pt\"\u003enetwork-service-dev@chromium.org\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1xjFD9yJVuUtekJe3a9rpBmYqTOvRuGwML3BP2SBvC3s/edit#heading\u003dh.nyhdzanbjl3i\" style\u003d\"background-color:transparent;font-size:10pt\"\u003esherifing notes\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1OyBYvN0dwvpqfSZBdsfZ29iTFqGnVS2sdiPV14Z-Fto/edit?usp\u003dsharing\" style\u003d\"background-color:transparent;font-size:10pt\"\u003econversion cheat sheet\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1hMav0DUXW5ZF67L_g5B92VR-hYEgfUchhU9oHBByeJA/edit?usp\u003dsharing\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ebug triaging instructions\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eDevice Service˜\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d612328\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eDevice\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eIdentity Service\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1gbS6QjjobxwSyl1FUv-4wct7q4YdLE2KjFF433uPvqI/edit#heading\u003dh.c3qzrjr1sqn7\" style\u003d\"background-color:transparent\"\u003eIdentity\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/document/d/14f3qqkDM9IE4Ff_l6wuXvCMeHfSC9TxKezXTCyeaPUY/edit\"\u003eConversion cheat sheet\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003emailing list:\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/identity-service-dev\"\u003e identity-service-dev@chromium.org\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003ePast Projects\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1JU8QUWxMEXWMqgkvFUumKSxr7Z-nfq0YvreSJTkMVmU/edit?usp\u003dsharing\"\u003ePrefs\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d654986\"\u003eProcess/Sandbox\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eA prioritized list of projects that still need to be done is \u003ca href\u003d\"https://docs.google.com/document/d/1VB0v_xwd7TqBLEF-5sFsC-zwqveEMS3EgJCtS_enzz8/edit?usp\u003dsharing\"\u003eavailable\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Code-Location\" /\u003eCode Location\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/services/\"\u003esrc/services/\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/servicification"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1002338444018869319"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1002338444018869319"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1002338444018869319"}],"author":[{"name":{"$t":"John Abd-El-Malek"},"email":{"$t":"jam@chromium.org"}}],"sites$pageName":{"$t":"servicification"},"sites$revision":{"$t":"27"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4940963746759737452"},"published":{"$t":"2014-02-27T16:16:12.767Z"},"updated":{"$t":"2018-10-17T20:37:11.083Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-17T20:37:09.334Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Simple developer workflow"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-This-document-has-been-moved-to-markdown-git.-The-up-to-date-version-can-be-found-at-https:-chromium.googlesource.com-chromiumos-docs-master-developer_guide.md-Making-changes-to-packages-whose-source-code-is-checked-into-Chromium-OS-git-repositories\" /\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)\"\u003e\u003cdiv\u003eThis document has been moved to markdown/git. The up-to-date version can be found at \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/developer_guide.md#Making-changes-to-packages-whose-source-code-is-checked-into-Chromium-OS-git-repositories\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/developer_guide.md#Making-changes-to-packages-whose-source-code-is-checked-into-Chromium-OS-git-repositories\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2820759774765985493"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide/developer-workflow"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4940963746759737452"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4940963746759737452"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4940963746759737452"}],"author":[{"name":{"$t":"Bertrand Simonnet"},"email":{"$t":"bsimonnet@chromium.org"}}],"sites$pageName":{"$t":"developer-workflow"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/112122399293073176"},"published":{"$t":"2018-09-19T21:24:00.746Z"},"updated":{"$t":"2018-10-17T16:16:34.828Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-17T16:16:34.828Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/112122399293073176"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/112122399293073176"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/112122399293073176"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/lenovo-n-series/300e-Chromebook/p/88ELC1S9997\"\u003eLenovo 300e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"hana"},{"index":"E","name":"Board name(s)","$t":"hana"},{"index":"F","name":"Base board","$t":"oak"},{"index":"G","name":"User ABI","$t":"arm"},{"index":"H","name":"Kernel","$t":"3.18"},{"index":"I","name":"Kernel ABI","$t":"aarch64"},{"index":"J","name":"Platform","$t":"MT8173"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":""}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6979741920230415442"},"published":{"$t":"2018-10-15T05:50:14.631Z"},"updated":{"$t":"2018-10-15T05:50:34.337Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-15T05:50:34.337Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6979741920230415442"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6979741920230415442"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6979741920230415442"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-10-15"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"\"\u003eAcer Chromebook 514\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Epaulette"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R69"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4544990610445440351"},"published":{"$t":"2013-11-18T04:31:21.615Z"},"updated":{"$t":"2018-10-14T17:19:02.871Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-14T17:19:00.737Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium OS SDK Creation"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Prebuilt-Flow\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePrebuilt Flow\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bootstrap-Flow\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eBootstrap Flow\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Gentoo-Stage3\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eGentoo Stage3\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Update-Base-Packages\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eUpdate Base Packages\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Build-Cross-compilers\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003eBuild Cross-compilers\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Build-amd64-host\"\u003e\u003cstrong\u003e3.5 \u003c/strong\u003eBuild amd64-host\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Package-The-SDK\"\u003e\u003cstrong\u003e3.6 \u003c/strong\u003ePackage The SDK\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Generate-Standalone-Cross-compilers\"\u003e\u003cstrong\u003e3.7 \u003c/strong\u003eGenerate Standalone Cross-compilers\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Test-The-SDK\"\u003e\u003cstrong\u003e3.8 \u003c/strong\u003eTest The SDK\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Publish-The-SDK\"\u003e\u003cstrong\u003e3.9 \u003c/strong\u003ePublish The SDK\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upgrading-The-Stage3\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eUpgrading The Stage3\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eNote: This is an internal tools document and has nothing to do with building a Chromium OS image that one can boot and test on.  If you were linked here from an article claiming otherwise, the author is mistaken.\u003c/font\u003e\u003c/b\u003e\u003c/p\u003e\u003cp\u003eThe Chromium OS project has an SDK that provides a standalone environment for building the target system. When you boil it down, it's simply a Gentoo/Linux chroot with a lot of build scripts to simplify and automate the overall build process. We use a chroot as it ends up being much more portable -- we don't have to worry what distro you've decided to run and whether you've got all the right packages (and are generally up-to-date). Most things run inside of the chroot, and we fully control that environment, so Chromium OS developers have a lot less to worry about. It does mean that you need root on the system, but unfortunately, that cannot be avoided.\u003c/p\u003e\r\n\u003cp\u003eThis document will cover how the SDK is actually created. It assumes you have a full Chromium OS checkout already.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Prebuilt-Flow\" /\u003ePrebuilt Flow\u003c/h2\u003e\r\n\u003cp\u003eWhen you run `cros_sdk` (found in \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/scripts/cros_sdk.py\"\u003echromite/bin/\u003c/a\u003e) for the first time, it automatically downloads the last known good sdk version and unpacks it into the chroot/ directory (in the root of the Chromium OS source checkout).\u003c/p\u003e\r\n\u003cp\u003eThat version information is stored in:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos/binhost/host\"\u003esrc/chromiumos-overlay/chromeos/binhost/host/sdk_version.conf\u003c/a\u003e\u003cbr /\u003e\r\nSDK_LATEST_VERSION\u003d\"2013.11.16.104134\"\u003c/code\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eThis is used to look up the tarball in the \u003ca href\u003d\"https://commondatastorage.googleapis.com/chromiumos-sdk/\"\u003echromiumos-sdk\u003c/a\u003e Google Storage bucket. So with the information above, we know to fetch the file:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e\u003ca href\u003d\"https://commondatastorage.googleapis.com/chromiumos-sdk/cros-sdk-2013.11.16.104134.tar.xz\"\u003ehttps://commondatastorage.googleapis.com/chromiumos-sdk/cros-sdk-2013.11.16.104134.tar.xz\u003c/a\u003e\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bootstrap-Flow\" /\u003eBootstrap Flow\u003c/h2\u003e\r\n\u003cp\u003eYou might be wondering about the chicken \u0026amp; egg problem. How do you create a prebuilt sdk tarball without using a prebuilt sdk tarball? We do this everyday and is in fact a design feature: if the sdk itself were to be broken by a commit, how would we recover easily? To avoid that, we have a chromiumos-sdk bot config that does a full bootstrap and runs in the normal \u003ca href\u003d\"http://build.chromium.org/p/chromiumos/builders/chromiumos%20sdk\"\u003eChromium OS waterfall\u003c/a\u003e.\u003c/p\u003e\r\n\u003cp\u003eBut we still need some bootstrap starting point. For that, we turn to \u003ca href\u003d\"http://www.gentoo.org/main/en/where.xml\" rel\u003d\"nofollow\"\u003eGentoo\u003c/a\u003e. Their release process includes publishing what is called a stage3 tarball. It's a full (albeit basic) Gentoo chroot that is used for installing Gentoo. We use it for creating the Chromium OS SDK from scratch. Then we tar up the result and publish it in the public Google Storage bucket for people.\u003c/p\u003e\r\n\u003cp\u003eIf the overall SDK generation fails, then we don't refresh the SDK, and the released files stay stable for developers.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\r\n\u003cp\u003eThe overall process looks like:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003edownload last known good Gentoo stage3\u003c/li\u003e\r\n\u003cli\u003eupgrade/install/remove development packages that we will need (things like git)\u003c/li\u003e\r\n\u003cli\u003ebuild all the cross-compilers we care about\u003c/li\u003e\r\n\u003cli\u003ebuild the board \"amd64-host\" (an old name for the sdk) from scratch\u003c/li\u003e\r\n\u003cli\u003einstall all the cross-compilers into the new board root\u003c/li\u003e\r\n\u003cli\u003egenerate standalone copies of the cross-compilers for use by the Simple Chrome workflow (among other things)\u003c/li\u003e\r\n\u003cli\u003everify the freshly built sdk works by building a selection of boards\u003c/li\u003e\r\n\u003cli\u003eupload all the binary packages, cross-compilers, and the sdk itself\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Gentoo-Stage3\" /\u003eGentoo Stage3\u003c/h3\u003e\r\n\u003cp\u003eWe grab a copy of the Gentoo stage3 tarball and post it to the chromiumos-sdk Google Storage bucket.\u003c/p\u003e\r\n\u003cp\u003eThe version of the last known good stage3 is stored in:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos/binhost/host/sdk_version.conf\"\u003esrc/third_party/chromiumos-overlay/chromeos/binhost/host/sdk_version.conf\u003c/a\u003e\u003cbr /\u003e\r\nBOOTSTRAP_LATEST_VERSION\u003d\"2013.01.30\"\u003c/code\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eThis is used to look up the tarball in the chromiumos-sdk Google Storage bucket. So with the information above, we know to fetch the file:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e\u003ca href\u003d\"https://commondatastorage.googleapis.com/chromiumos-sdk/stage3-amd64-2013.01.30.tar.xz\"\u003ehttps://commondatastorage.googleapis.com/chromiumos-sdk/stage3-amd64-2013.01.30.tar.xz\u003c/a\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eWe simply unpack it and then chroot into it using our build scripts.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Update-Base-Packages\" /\u003eUpdate Base Packages\u003c/h3\u003e\r\n\u003cp\u003eNow we run the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/crosutils/+/master/sdk_lib/make_chroot.sh\"\u003emake_chroot.sh\u003c/a\u003e script (found in src/scripts/sdk_lib/) to handle installing/removing/upgrading key packages. It is very careful in making sure to install, remove, and upgrade packages in the right order to avoid conflicts and circular dependencies. We can also add various intermediate hacks as the versions of packages we upgrade in our overlays drift further away from the ones found in the stage3, although it's preferable to just update the base stage3 version when possible. See the section at the end of this page for more information.\u003c/p\u003e\r\n\u003cp\u003eIt then runs the normal \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/crosutils/+/master/update_chroot\"\u003eupdate_chroot\u003c/a\u003e script which installs all of the packages that normally exist in the SDK (the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/virtual/target-sdk\"\u003evirtual/target-sdk\u003c/a\u003e meta package).\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Build-Cross-compilers\" /\u003eBuild Cross-compilers\u003c/h3\u003e\r\n\u003cp\u003eThe cbuildbot process will then run \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/scripts/cros_setup_toolchains.py\"\u003ecros_setup_toolchains\u003c/a\u003e to generate all toolchains marked for inclusion in the SDK (see the toolchain.conf file for more details).\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Build-amd64-host\" /\u003eBuild amd64-host\u003c/h3\u003e\r\n\u003cp\u003eNow that we have a chroot that pretty much looks and acts like a Chromium OS SDK, we can go ahead and build the Chromium OS SDK from scratch. We do this to verify the latest native toolchain is sane, and so that we can produce a pristine SDK without random garbage accumulating over time (like all the temp/generated files found in the current chroot).\u003c/p\u003e\r\n\u003cp\u003eThis step is accomplished by just running:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e./setup_board --board\u003damd64-host --skip_chroot_upgrade --nousepkg --reuse_pkgs_from_local_boards\u003c/code\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eIf you're used to the normal Chromium OS flow, be aware that this step is really like running setup_board and build_packages in one go. Arguably it shouldn't be doing this, but it doesn't matter enough today to get around to cleaning it up.\u003c/p\u003e\r\n\u003cp\u003eThis means it'll take quite a long time for this to finish (as it has to build a few hundred packages from source). Everything will be written to \u003ccode\u003e/board/amd64-host\u003c/code\u003e.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Package-The-SDK\" /\u003ePackage The SDK\u003c/h3\u003e\r\n\u003cp\u003eNow that the SDK is compiled and has everything we want, we create the SDK tarball. We don't upload it just yet though as it hasn't been tested.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Generate-Standalone-Cross-compilers\" /\u003eGenerate Standalone Cross-compilers\u003c/h3\u003e\r\n\u003cp\u003eSince our cross-compilers are pretty cool \u0026amp; useful, we want to be able to use them all by themselves. In other words, without the overhead of the full Chromium OS source checkout and the SDK. With a few tricks, we can accomplish exactly that. It copies all the host libraries the toolchain itself uses, generates wrapper scripts so that the local copies of libraries can be found, and then takes care of munging all the paths to make them standalone.\u003c/p\u003e\r\n\u003cp\u003eThe \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/chromite/+/master/scripts/cros_setup_toolchains.py\"\u003ecros_setup_toolchains\u003c/a\u003e script has all the logic.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Test-The-SDK\" /\u003eTest The SDK\u003c/h3\u003e\r\n\u003cp\u003eWe want to be sure that the SDK we just built is actually sane. This helps us from releasing a toolchain update (like gcc) that is horribly broken (like can't properly compile or link things). To test this, we simply use the SDK tarball built earlier to create a new chroot. This also verifies the normal developer workflow of creating a new chroot from this SDK.\u003c/p\u003e\r\n\u003cp\u003eInside of the new chroot, we do a normal build flow for a couple of boards. At the moment, that means one for each major architecture (i.e. amd64-generic-full, arm-generic-full, and x86-generic-full). We only run setup_board+build_packages though; no unittests or anything else (as current history as shown it to not be necessary).\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Publish-The-SDK\" /\u003ePublish The SDK\u003c/h3\u003e\r\n\u003cp\u003eOnce all the tests pass, we go ahead and upload the results:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003ethe SDK tarball\u003c/li\u003e\r\n\u003cli\u003ethe standalone cross-compiler tarballs\u003c/li\u003e\r\n\u003cli\u003ebinary packages for the chroot itself\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Upgrading-The-Stage3\" /\u003eUpgrading The Stage3\u003c/h2\u003e\r\n\u003cp\u003eThe stage3 needs to be refreshed from time to time. It's a largely mechanical process. It boils down to:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eselect a new stage3 from \u003ca href\u003d\"http://www.gentoo.org/main/en/where.xml\" rel\u003d\"nofollow\"\u003eupstream Gentoo\u003c/a\u003e (look at the amd64 stage3s)\u003c/li\u003e\r\n\u003cli\u003emake sure it's compressed with xz and not bzip2\u003c/li\u003e\r\n\u003cli\u003eupload it to the \u003ca href\u003d\"https://cloud.google.com/console#/storage/chromiumos-sdk/\"\u003echromiumos-sdk bucket\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eupdate the bootstrap version in the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos/binhost/host/sdk_version.conf\"\u003esrc/chromiumos-overlay/chromeos/binhost/host/sdk_version.conf\u003c/a\u003e file\u003c/li\u003e\r\n\u003cli\u003erun some chromiumos-sdk remote trybot configs\u003c/li\u003e\r\n\u003cli\u003ereview the InitSDK stage log and look for packages that get downgraded (\"[ebuild     UD ]\" lines)\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/gentoo-package-upgrade-process\"\u003epost package upgrades for all the relevant packages\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eupdate the \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/crosutils/+/master/sdk_lib/make_chroot.sh\"\u003emake_chroot.sh\u003c/a\u003e script as needed (clean out old hacks, add new ones, etc...)\u003c/li\u003e\r\n\u003cli\u003erepeat process until the InitSDK stage works\u003c/li\u003e\r\n\u003cli\u003eonce the whole bot config passes, your works is done\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8945126227284375934"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/build/sdk-creation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4544990610445440351"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4544990610445440351"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4544990610445440351"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"sdk-creation"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6868177059183200025"},"published":{"$t":"2011-11-10T20:25:42.156Z"},"updated":{"$t":"2018-10-10T20:24:19.309Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T20:24:19.309Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using Chromium OS SDK as standalone, DIY"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Target-audience\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eTarget audience\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Provided-by-the-SDK\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eProvided by the SDK\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Installation-instructions\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eInstallation instructions\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Getting-the-SDK\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eGetting the SDK\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Unzipping-entering-SDK\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eUnzipping \u0026amp; entering SDK\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Optional:-setting-up-various-environment-bits-prior-to-chroot\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eOptional: setting up various environment bits prior to chroot\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\nThis page describes how to use the Chromium OS SDK as standalone package, without anything on top.\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Target-audience\" /\u003eTarget audience\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003eDevelopers who want to experiment with the Chromium OS binary enviroment, but not build any of Chromium OS\u003c/li\u003e\r\n\u003cli\u003eDevelopers who want just the toolchain\u003c/li\u003e\r\n\u003cli\u003ePeople who need the chroot, but do not want to download any sources\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eFor the most part, you should know what you're doing to go this way.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Provided-by-the-SDK\" /\u003eProvided by the SDK\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003eComplete system tools, just like in the normal SDK chroot\u003c/li\u003e\r\n\u003cli\u003eComplete toolchain packages for:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ehost (no prefix or x86_64-cros-linux-gnu-)\u003c/li\u003e\r\n\u003cli\u003eall currently supported targets\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003earmv7a-cros-linux-gnueabi-\u003c/li\u003e\r\n\u003cli\u003ex86_64-cros-linux-gnu-\u003c/li\u003e\r\n\u003cli\u003ei686-pc-linux-gnu-\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003egold and bfd ld\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eNOTE: It is not possible to switch toolchains or install new ones, as well as generally update the system in any way. If you want a newer version, delete all and start over.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Installation-instructions\" /\u003eInstallation instructions\u003c/h2\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Getting-the-SDK\" /\u003eGetting the SDK\u003c/h3\u003e\r\n\u003cp\u003eThe latest version of SDK can be located in chromiumos-overlay.git repository, in \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos/binhost/host/sdk_version.conf\" style\u003d\"font-size:small;background-color:transparent\"\u003esdk_version.conf\u003c/a\u003e\u003c/p\u003e\r\n\u003cp\u003eThe individual SDK tarballs can be found in the Google Storage mirror: \u003ca href\u003d\"http://commondatastorage.googleapis.com/chromiumos-sdk/\"\u003ehttp://commondatastorage.googleapis.com/chromiumos-sdk/\u003c/a\u003e\u003c/p\u003e\r\n\u003cp\u003eIn order to download the latest SDK automatically, you can execute:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003eeval $(curl -s https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos/binhost/host/sdk_version.conf?format\u003dTEXT | base64 -d | grep '^SDK_LATEST_VERSION\u003d')\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ewget \"https://commondatastorage.googleapis.com/chromiumos-sdk/cros-sdk-${SDK_LATEST_VERSION}.tar.xz\"\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Unzipping-entering-SDK\" /\u003eUnzipping \u0026amp; entering SDK\u003c/h3\u003e\r\n\u003cp\u003eUnzip the SDK to a folder of your choice, for example \"./sdk\":\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003emkdir sdk\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecd sdk\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003etar xvf ../cros-sdk-${SDK_LATEST_VERSION}.tar.xz\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eSet up some mounts:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003emount -t proc proc ./proc\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003emount -t sysfs sysfs ./sys\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eEnter by using chroot:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003esudo chroot . /bin/bash\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Optional:-setting-up-various-environment-bits-prior-to-chroot\" /\u003eOptional: setting up various environment bits prior to chroot\u003c/h3\u003e\r\n\u003cp\u003eThese are mostly optional and depend on what do you want to do inside the chroot. For merely running gcc, you should need neither.\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003eMimic host network configuration:\u003cbr /\u003e\r\n\u003ccode\u003esudo cp /etc/resolv.conf /etc/hosts sdk/etc/\u003c/code\u003e\u003cbr /\u003e\r\nThis usually needs to be done only once unless your host's network is dynamic.\u003c/li\u003e\r\n\u003cli\u003eBind /dev, if you're going to be working with any devices:\u003cbr /\u003e\r\n\u003ccode\u003esudo mount -o bind /dev sdk/dev\u003c/code\u003e\u003cbr /\u003e\u003c/li\u003e\r\n\u003cli\u003eMake a copy or bind-mount of any configuration/data you will need inside the chroot.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003cp\u003eRemember to clean up the chroot (especially) from mounts after you stop using it.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-sdk-standalone"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6868177059183200025"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6868177059183200025"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6868177059183200025"}],"author":[{}],"sites$pageName":{"$t":"using-sdk-standalone"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7681597207622038054"},"published":{"$t":"2011-12-06T19:44:15.720Z"},"updated":{"$t":"2018-10-10T20:15:11.133Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T20:15:09.499Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Recall"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#ff0000\" size\u003d\"5\"\u003eNote: the recall code has been deleted from autotest and is no longer available.\u003c/font\u003e\u003c/b\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRecall is a server-side system that intercepts DNS, HTTP and HTTPS traffic from clients for either recording or playback. This allows tests to be run in labs without Internet access by playing back pre-recorded copies of websites, allows tests to be run that use recorded copies of sites known to exhibit errors or many iterations of the same test to be run with the same data.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRecall is intended to be completely transparent to client tests.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIt runs as an autotest server test which makes some configuration changes to the server machine, and then runs the desired client test on the client wrapped with a Recall context manager that takes care of adjusting the client's configuration to redirect the traffic to the recall server (in the case it's not the network's default gateway already) and install a root certificate for HTTPS man-in-the-middling.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003ePrerequisites:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eAt the time of this writing you \u003cb\u003emust\u003c/b\u003e install the following packages, which are not installed by default.\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003ethe \u003cb\u003ednspython\u003c/b\u003e package in the chroot: \u003cfont face\u003d\"courier new, monospace\"\u003esudo emerge dnspython\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ethe \u003cb\u003eiproute2\u003c/b\u003e package on the chroot: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esudo emerge iproute2\u003c/span\u003e\u003c/li\u003e\u003cli\u003ethere may be other needed packages which I am now forgetting (iptables?)\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eIn addition, the server-side iptable command to set up the routing tables fails for me with this error:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eFATAL: Could not load /lib/modules/2.6.38.8-gg836/modules.dep: No such file or directory\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eI worked around this by copying that file from my root file system into the chroot.  (For testing, I also ran the same iptables command manually outside the chroot, so I am not sure if you need to do that so that some module is loaded correctly.)\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eFrom the command line:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eThe highest level way in which to run Recall is simply to use the \u003cfont face\u003d\"'courier new', monospace\"\u003etest_RecallServer\u003c/font\u003e test, which handles all of the heavy-lifting for you, and can be run using \u003cfont face\u003d\"'courier new', monospace\"\u003erun_remote_tests\u003c/font\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eRun \u003cfont face\u003d\"'courier new', monospace\"\u003edesktopui_UrlFetch\u003c/font\u003e on the client, record results which can be found as \u003cfont face\u003d\"'courier new', monospace\"\u003e\u0026lt;RESULTS DIR\u0026gt;/pickle\u003c/font\u003e:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e./run_remote_tests.sh --remote\u003d\u0026lt;DEVICE IP\u0026gt; test_RecallServer -a 'desktopui_UrlFetch'\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRun \u003cfont face\u003d\"'courier new', monospace\"\u003edesktopui_UrlFetch\u003c/font\u003e on the client, only returning results found in the given pickle file created from a previous recording:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e./run_remote_tests.sh --remote\u003d\u0026lt;DEVICE IP\u0026gt; test_RecallServer -a 'desktopui_UrlFetch /path/to/pickle'\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRun desktopui_UrlFetch on the client 100 times, the first time will be recorded, the subsequent 99 will use the playback only\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e./run_remote_tests.sh --remote\u003d\u0026lt;DEVICE IP\u0026gt; test_RecallServer -a 'desktopui_UrlFetch num_iterations\u003d100'\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRun desktopui_UrlFetch on the client using a simple proxy server that doesn't record (mostly for infrastructure testing)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e./run_remote_tests.sh --remote\u003d\u0026lt;DEVICE IP\u0026gt; test_RecallServer -a 'desktopui_UrlFetch proxy_only\u003d1'\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eInfrastructure restrictions mean that these test must always be run as root (or with sudo), and may not be run against the 127.0.0.1 address. This includes running them against VMs on your workstation, unless you set up a bridge network for KVM instead of using its userspace networking.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eFrom a control file:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou can also write a server suite that performs the same actions, perhaps on multiple tests, for example:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003edef run(machine):\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    host \u003d hosts.create_host(machine)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    job.run_test('test_RecallServer', host\u003dhost, test\u003d'desktopui_UrlFetch', pickle_file\u003d'/path/to/pickle')\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eparallel_simple(run, machines)\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eCustomizing server behaviour:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003cfont face\u003d\"'courier new', monospace\"\u003etest_RecallServer\u003c/font\u003e test takes care of many of the common cases, but in some situations it may not be appropriate to modify it to cover yours and instead create a new server test that uses the Recall infrastructure. This can be accomplished by deriving your test from \u003cfont face\u003d\"'courier new', monospace\"\u003erecall_test.RecallServerTest\u003c/font\u003e; the documentation for that class goes into greater detail, here's a very brief example:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efrom autotest_lib.server.cros import recall_test, recall\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eclass test_MyTest(recall_test.RecallServerTest):\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e    def initialize(self, host):\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    # minimum set up required\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    self.certificate_authority \u003d recall.CertificateAuthority(\"/O\u003dTest\")\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e        self.dns_client \u003d recall.DNSClient()\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    self.http_client \u003d recall.HTTPClient()\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    # takes care of the rest of the heavy lifting\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    # can be overidden a lot, see documentation\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e        recall_test.RecallServerTest.initialize(self, host)\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e    def run_once(self, host):\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e        self.RunTestOnHost('test_MyClientTest', host)\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eStatic server, custom client:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eFor even deeper diving, the Recall infrastructure can be run in a standalone manner. For example a server can be installed on the network which already has clients use it as a DNS server and Default Gateway via DHCP and redirects all traffic to itself with static \u003cfont face\u003d\"'courier new', monospace\"\u003eiptables\u003c/font\u003e rules. The recall server itself can be run by creating instances of \u003cfont face\u003d\"'courier new', monospace\"\u003erecall.DNSServer\u003c/font\u003e, \u003cfont face\u003d\"'courier new', monospace\"\u003erecall.HTTPServer\u003c/font\u003e, \u003cfont face\u003d\"'courier new', monospace\"\u003erecall.HTTPSServer\u003c/font\u003e, etc. by hand with fixed ports. See the documentation for the \u003cfont face\u003d\"'courier new', monospace\"\u003erecall\u003c/font\u003e package for more details, here's a very quick example:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efrom autotest_lib.server.cros import recall\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eca \u003d recall.CertificateAuthority(\"/O\u003dTest\")\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003edns \u003d recall.DNSServer(('', 5000), dns_client\u003dDNSClient())\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eclient \u003d recall.DeterministicScriptInjector(recall.HTTPClient())\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ehttp \u003d recall.HTTPServer(('', 8000), http_client\u003dclient)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ehttps \u003d recall.HTTPSServer(('', 4430), http_client\u003dclient, dns_client\u003ddns.dns_client, certificate_authority\u003dca)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e# remain running as long as needed\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003edns.shutdown()\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ehttp.shutdown()\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ehttps.shutdown()\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003eA client test can now be written that uses this fixed infrastructure, though note that this test will not function without it. Client tests simply wrap the call in the \u003cfont face\u003d\"'courier new', monospace\"\u003econtrol\u003c/font\u003e file with the context manager:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efrom autotest_lib.client.cros import recall\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ewith recall.RecallServer(IP_OF_SERVER):\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    job.run_test(...)\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe context manager takes care of setting up the root certificate used for HTTPS recording, it also takes care of the DNS Server and Default Route if those aren't already correct.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/recall"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7681597207622038054"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7681597207622038054"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7681597207622038054"}],"author":[{"email":{"$t":"keybuk@chromium.org"}}],"sites$pageName":{"$t":"recall"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6698580938212761321"},"published":{"$t":"2011-06-20T20:50:15.877Z"},"updated":{"$t":"2018-10-10T20:10:09.895Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T20:10:09.895Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How to force the out-of-box experience (OOBE)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eYou can force your device to redo the out-of-box experience (OOBE) as follows:\u003cdiv\u003e\u003cul\u003e\u003cli\u003eBoot to login screen\u003c/li\u003e\u003cli\u003eSwitch to VT2 (press ctrl-alt-F2 -- only possible in Dev mode)\u003c/li\u003e\u003cli\u003eLogin as root (or chronos and use sudo)\u003c/li\u003e\u003cli\u003estop ui \u003c/li\u003e\u003cli\u003erm -rf /home/chronos/Local\\ State \u003c/li\u003e\u003cli\u003erm -rf /home/chronos/.oobe_completed \u003c/li\u003e\u003cli\u003ereboot\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/force-out-of-box-experience-oobe"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6698580938212761321"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6698580938212761321"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6698580938212761321"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$pageName":{"$t":"force-out-of-box-experience-oobe"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5882720129535983232"},"published":{"$t":"2015-04-21T15:56:05.698Z"},"updated":{"$t":"2018-10-10T20:09:23.218Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T20:09:23.218Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Energy Aware Scheduling"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eEnergy Aware Scheduling reading list\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"width:410px;height:14px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIn Kernel Switcher (IKS)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:657px;height:14px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"https://lwn.net/Articles/481055/\" rel\u003d\"nofollow\"\u003ehttps://lwn.net/Articles/481055/\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://lwn.net/Articles/501501/\" rel\u003d\"nofollow\"\u003ehttps://lwn.net/Articles/501501/\u003c/a\u003e\u003cbr /\u003e\u003c/font\u003e\u003ca href\u003d\"https://lwn.net/Articles/539840/\" style\u003d\"font-family:arial,sans-serif;font-size:small\" rel\u003d\"nofollow\"\u003ehttps://lwn.net/Articles/539840/\u003cbr /\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"https://wiki.linaro.org/projects/big.LITTLE.MP/Big.Little.Switcher/Docs/in-kernel-code\" rel\u003d\"nofollow\"\u003ehttps://wiki.linaro.org/projects/big.LITTLE.MP/Big.Little.Switcher/Docs/in-kernel-code\u003c/a\u003e\u003cbr /\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"https://events.linuxfoundation.org/images/stories/slides/elc2013_poirier.pdf\" rel\u003d\"nofollow\"\u003ehttps://events.linuxfoundation.org/images/stories/slides/elc2013_poirier.pdf\u003c/a\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:410px;height:14px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;color:rgb(57,56,54);line-height:1.2em;margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent\"\u003eEnergy-Aware\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;color:rgb(57,56,54);line-height:1.2em;background-color:transparent\"\u003e Scheduling\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;color:rgb(57,56,54);line-height:1.2em;margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent\"\u003e (EAS)\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"width:657px;height:14px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"http://lwn.net/Articles/602479/\" rel\u003d\"nofollow\"\u003ehttp://lwn.net/Articles/602479/\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://www.linaro.org/blog/core-dump/energy-aware-scheduling-eas-project/\" rel\u003d\"nofollow\"\u003ehttp://www.linaro.org/blog/core-dump/energy-aware-scheduling-eas-project/\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://lwn.net/Articles/609969/\" rel\u003d\"nofollow\"\u003ehttps://lwn.net/Articles/609969/\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1YV44gufokmuKbeNG8vjOJirEY_GdsJymxP2ayHG4FAM/edit\"\u003ehttps://docs.google.com/document/d/1YV44gufokmuKbeNG8vjOJirEY_GdsJymxP2ayHG4FAM/edit\u003c/a\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:410px;height:14px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePower State Coordination Interface (PSCI)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"width:657px;height:14px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003ca href\u003d\"http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf\" rel\u003d\"nofollow\"\u003ehttp://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf\u003c/a\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eARM Trusted Firmware (ARM TF)\u003c/span\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"https://github.com/ARM-software/arm-trusted-firmware\" style\u003d\"font-family:arial,sans-serif;font-size:small\" rel\u003d\"nofollow\"\u003ehttps://github.com/ARM-software/arm-trusted-firmware\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://www.slideshare.net/linaroorg/arm-trusted-firmareforarmv8alcu13\" rel\u003d\"nofollow\"\u003ehttp://www.slideshare.net/linaroorg/arm-trusted-firmareforarmv8alcu13\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://www.slideshare.net/linaroorg/hkg15502-arm-trusted-firmware-evolution\" rel\u003d\"nofollow\"\u003ehttp://www.slideshare.net/linaroorg/hkg15502-arm-trusted-firmware-evolution\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://www.slideshare.net/linaroorg/hkg15-505-power-management-interactions-with-optee-repaired\" rel\u003d\"nofollow\"\u003ehttp://www.slideshare.net/linaroorg/hkg15-505-power-management-interactions-with-optee-repaired\u003c/a\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eARMv8-A Architecture\u003c/span\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://www.arm.com/products/processors/armv8-architecture.php\" style\u003d\"font-family:arial,sans-serif;font-size:small\" rel\u003d\"nofollow\"\u003ehttp://www.arm.com/products/processors/armv8-architecture.php\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ebig.LITTLE\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://www.arm.com/files/pdf/big_LITTLE_Technology_the_Futue_of_Mobile.pdf\" rel\u003d\"nofollow\"\u003ehttp://www.arm.com/files/pdf/big_LITTLE_Technology_the_Futue_of_Mobile.pdf\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://www.arm.com/products/processors/technologies/biglittleprocessing.php\" rel\u003d\"nofollow\"\u003ehttp://www.arm.com/products/processors/technologies/biglittleprocessing.php\u003c/a\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333330154419px\"\u003e\u003ca href\u003d\"https://wiki.linaro.org/projects/big.LITTLE.MP\" rel\u003d\"nofollow\"\u003ehttps://wiki.linaro.org/projects/big.LITTLE.MP\u003c/a\u003e\u003c/span\u003e\u003cbr /\u003e\u003ca href\u003d\"http://events.linuxfoundation.org/sites/events/files/slides/clement-smp-bring-up-on-arm-soc.pdf\" rel\u003d\"nofollow\"\u003ehttp://events.linuxfoundation.org/sites/events/files/slides/clement-smp-bring-up-on-arm-soc.pdf\u003c/a\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecpufreq\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://www.ibm.com/developerworks/linux/library/l-cpufreq-1/index.html\" rel\u003d\"nofollow\"\u003ehttp://www.ibm.com/developerworks/linux/library/l-cpufreq-1/index.html\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://www.kernel.org/doc/Documentation/cpu-freq/\" rel\u003d\"nofollow\"\u003ehttps://www.kernel.org/doc/Documentation/cpu-freq/\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecpuidle\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"https://lwn.net/Articles/384146/\" rel\u003d\"nofollow\"\u003ehttps://lwn.net/Articles/384146/\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"https://www.kernel.org/doc/Documentation/cpuidle/\" rel\u003d\"nofollow\"\u003ehttps://www.kernel.org/doc/Documentation/cpuidle/\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/energy-aware-scheduling"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5882720129535983232"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5882720129535983232"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5882720129535983232"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$pageName":{"$t":"energy-aware-scheduling"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6513026710757802788"},"published":{"$t":"2014-08-14T03:50:50.716Z"},"updated":{"$t":"2018-10-10T14:56:16.544Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T14:56:14.907Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Licensing in Chromium OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003eNote: This is not legal advice; if you want that, consult a lawyer. This section discusses purely technical measures that are available in the Chromium OS distribution.\u003c/b\u003e\u003cp\u003eSelect the area that you're interested in:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/licensing/licensing-for-chromiumos-package-owners\"\u003eLicensing Handling For Package Owners\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003ee.g. people writing ebuilds\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/licensing/building-a-distro\"\u003eLicensing Handling For OS Builders\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003ee.g. people generating images\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/licensing/licensing-for-chromiumos-developers\"\u003eInternal Licensing Handling For Chromium OS Developers\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003ee.g. people dealing with the license generation logic\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Chrome-OS-Devices\" /\u003eChrome OS Devices\u003c/h2\u003e\u003cdiv\u003e\u003cp style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003eChrome OS credits all the open source projects used in each version of Chrome OS on each device.\u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cp\u003eThere is no single license file that is correct for all devices and all versions, so p\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003elease go to settings/help (or type \u003ca style\u003d\"color:rgb(71,18,100)\"\u003echrome://help\u003c/a\u003e) and click on \u003c/span\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003e\"open source software\" (or type \u003ca style\u003d\"color:rgb(71,18,100)\"\u003echrome://credits\u003c/a\u003e and \u003c/span\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003e\u003ca style\u003d\"color:rgb(71,18,100)\"\u003echrome://os-credits\u003c/a\u003e).\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003cp style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003e\u003cfont color\u003d\"#222222\"\u003eIf you would like an online version, a necessarily not up to date version of the OS credits can be found here:\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/91e5715acfa6cac439f98438f1bedade3d863b9a/chrome/browser/resources/chromeos/about_os_credits.html\" style\u003d\"font-family:arial,sans-serif;font-size:10pt;background-color:transparent\"\u003ehttps://chromium.googlesource.com/chromium/src/+/91e5715acfa6cac439f98438f1bedade3d863b9a/chrome/browser/resources/chromeos/about_os_credits.html\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/licensing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6513026710757802788"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6513026710757802788"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6513026710757802788"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"licensing"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},"published":{"$t":"2018-10-10T14:48:55.928Z"},"updated":{"$t":"2018-10-10T14:51:27.224Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T14:51:24.358Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Obsolete Documentation"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eDocuments under this section are considered obsolete and are archived here when there isn't a clear replacement.\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8792873272714974581"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"obsolete"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},"published":{"$t":"2011-04-25T20:54:39.131Z"},"updated":{"$t":"2018-10-10T14:50:36.509Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T14:50:36.509Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using Eclipse to debug Chrome on Chrome OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#cc0000\" size\u003d\"5\"\u003e\u003cb\u003eDEPRECATED\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003ejamescook says: I learned on 2012-03-08 that our Eclipse workflow is no longer expected to work.\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003erkc says: The remote debugging workflow for Chrome on ChromeOS changed a while ago - the linux_disable_pie flag was nuked; instead cmtice@ wrote a script that makes remote debugging chrome very simple. \u003c/i\u003e\u003ci\u003eDetails on how to use the script are at \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide#TOC-Remote-Debugging\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide#TOC-Remote-Debugging\u003c/a\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eThe Catch: The script will only work on a test image for now - this is because only the test image has the ssh server running by default and copies over the test keys which allow authentication-less connections to the device; something the script depends on.\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eOur debugging from eclipse solution is in an unknown state - if anyone can test/fix it, a lot of developers on the team would be quite delighted :)\u003c/i\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7477245120679793712"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$pageName":{"$t":"using-eclipse-to-debug-chrome-on-chrome-os"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3995305853347965825"},"published":{"$t":"2011-04-25T21:29:48.473Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:29:48.473Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"debugger shared libraries.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3995305853347965825"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/debugger%20shared%20libraries.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3995305853347965825"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3995305853347965825"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3995305853347965825"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3995305853347965825"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4079853089429853327"},"published":{"$t":"2011-04-25T21:25:37.682Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:25:37.682Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chrome remote main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4079853089429853327"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/chrome%20remote%20main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4079853089429853327"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4079853089429853327"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4079853089429853327"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4079853089429853327"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7985475112187217857"},"published":{"$t":"2011-04-25T21:14:12.235Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:14:12.235Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"c++ build env.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7985475112187217857"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/c%2B%2B%20build%20env.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7985475112187217857"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7985475112187217857"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7985475112187217857"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7985475112187217857"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8007084739961498481"},"published":{"$t":"2011-04-25T21:28:17.186Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:28:17.186Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"debugger main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8007084739961498481"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/debugger%20main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8007084739961498481"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8007084739961498481"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8007084739961498481"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8007084739961498481"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8308751908898524489"},"published":{"$t":"2011-04-25T21:11:51.350Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:11:51.350Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"c++ build.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8308751908898524489"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/c%2B%2B%20build.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8308751908898524489"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8308751908898524489"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8308751908898524489"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8308751908898524489"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8424273174780203132"},"published":{"$t":"2011-04-25T21:30:50.408Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:30:50.408Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"debug connection.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8424273174780203132"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/debug%20connection.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8424273174780203132"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8424273174780203132"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8424273174780203132"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8424273174780203132"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9104311404334030077"},"published":{"$t":"2011-04-25T21:06:26.143Z"},"updated":{"$t":"2018-10-10T14:50:36.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:06:26.143Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"resource-filters.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9104311404334030077"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/resource-filters.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9104311404334030077"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9104311404334030077"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9104311404334030077"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9104311404334030077"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1834099782910742936"},"published":{"$t":"2011-08-10T18:33:21.820Z"},"updated":{"$t":"2018-10-10T14:50:36.496Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-10T18:33:21.820Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Resource Filters.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1834099782910742936"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/Resource%20Filters.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1834099782910742936"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1834099782910742936"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1834099782910742936"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1834099782910742936"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4202832331614612637"},"published":{"$t":"2011-04-25T21:10:39.409Z"},"updated":{"$t":"2018-10-10T14:50:36.496Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-25T21:10:39.409Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Properties for src.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4202832331614612637"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7477245120679793712"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/using-eclipse-to-debug-chrome-on-chrome-os/Properties%20for%20src.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4202832331614612637"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4202832331614612637"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4202832331614612637"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4202832331614612637"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1710322288975155810"},"published":{"$t":"2011-08-10T23:40:17.463Z"},"updated":{"$t":"2018-10-10T14:49:29.342Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T14:49:29.342Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"monitoring tools"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eWe can use two tools to monitor the system:\u003cbr /\u003e\r\n\u003col\u003e\u003cli\u003e\r\n\u003ca href\u003d\"http://www.arm.com/products/tools/software-tools/ds-5/streamline.php\" rel\u003d\"nofollow\"\u003estreamline\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003esystemtap\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cb\u003eStreamline\u003c/b\u003e\u003cbr /\u003e\r\nFor the ARM platform, we can use streamline to monitor the activities in the system. It can give us a timeline of utilization of the system sources such as CPU load, cache, interrupts, disk IO, memory, network, etc. It can also display the CPU utilization of each process. \u003cbr /\u003e\r\nIt requires two components:\u003cbr /\u003e\r\n\u003col\u003e\u003cli\u003eone works on the target device to monitor the system\u003c/li\u003e\r\n\u003cli\u003eone works on our desktop computer to display the captured activities, which is a plugin in eclipse.\u003c/li\u003e\r\n\u003c/ol\u003e\r\nIn order to capture the activities in the target device, we need to run a deamon called \u003cb\u003e\u003ci\u003egatord\u003c/i\u003e\u003c/b\u003e on the target device, which requires a kernel module.\u003cbr /\u003e\r\nIn order to build the modules, we need to build the kernel first. The easiest way is:\u003cbr /\u003e\r\n\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eFEATURES\u003dnoclean emerge-tegra2_seaboard chromeos-kernel\u003c/span\u003e\u003cbr /\u003e\r\nThe kernel will be built in \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e/build/tegra2_seaboard/tmp/portage/sys-kernel/chromeos-kernel-9999/work/chromeos-kernel-9999/build/tegra2_seaboard.\u003cbr /\u003e\r\nThen we run\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003emake -C /build/tegra2_seaboard/tmp/portage/sys-kernel/chromeos-kernel-9999/work/chromeos-kernel-9999/build/tegra2_seaboard/ M\u003d`pwd` ARCH\u003darm CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi- modules\u003c/span\u003e\u003cbr /\u003e\r\nAfter building the kernel module, we need to copy gatord and the kernel module to the target device, and they must be placed in the same directory.\u003cbr /\u003e\r\n\u003ca href\u003d\"http://infocenter.arm.com/help/index.jsp?topic\u003d/com.arm.doc.dui0482b/index.html\" rel\u003d\"nofollow\"\u003eARM DS-5 Using ARM Streamline\u003c/a\u003e has more detailed information about building and using streamline.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIn order to profile ChromeOS during its bootup, we don't have enough time to set the Eclipse for DS-5 to connect to ChromeOS, and capture the profiling result. Instead, we can run the daemon in a \"local capture\" mode, i.e., we can run the daemon on the target device and it stores the captured result in the local disk, and we can fetch the result after ChromeOS boots up. We need to provide gatord a xml file to specify options for the \"local capture\" mode. A xml file can be as below:\u003cbr /\u003e\r\n\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e\u0026lt;?xml version\u003d\"1.0\" encoding\u003d\"US-ASCII\" ?\u0026gt;\u003c/span\u003e\u003cbr style\u003d\"color:rgb(106,168,79)\" /\u003e\r\n\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e\r\n\u0026lt;session version\u003d\"1\" title\u003d\"local-test\" call_stack_unwinding\u003d\"yes\"\u003c/span\u003e\u003cbr style\u003d\"color:rgb(106,168,79)\" /\u003e\r\n\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e\r\n buffer_mode\u003d\"streaming\" sample_rate\u003d\"normal\" target_path\u003d\"/tmp/@F_@N\"\u003c/span\u003e\u003cbr style\u003d\"color:rgb(106,168,79)\" /\u003e\r\n\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e\r\n duration\u003d\"10\"/\u0026gt;\u003c/span\u003e\u003cbr /\u003e\r\nMore information about \"local capture\" can be find at \u003ca href\u003d\"http://infocenter.arm.com/help/index.jsp?topic\u003d/com.arm.doc.faqs/ka14991.html\" rel\u003d\"nofollow\"\u003ehere\u003c/a\u003e.\u003cbr /\u003e\u003cbr /\u003eHere is the result of a local capture after post-startup, where ureadahead starts running. Streamline captures the system information for 10 seconds and the boot takes about 5 seconds to complete after post-startup. From streamline, we can see that disk IO is constantly busy during boot, but the throughput isn't high, about 5-10MB/s. Meanwhile, the CPU load isn't high either after 2 seconds. ChromeOS uses squashfs as the root filesystem during this boot, and the best read performance seen on this device is about 20Mb/s, which means we potentially have resources to increase the IO performance to improve the boot performance.\u003cbr /\u003eFrom this snapshot, we can also observe that the CPU frequency goes up and down a little bit because cpuidle is enabled, which might also hurt the boot performance.\u003cbr /\u003eAt the bottom, streamline shows the status of all processes and threads, which tells us the valuable information such as which process is using the most of CPU at some particular time.\u003cbr /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/monitoring-tools/timeline.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1539182969332/chromium-os/obsolete/monitoring-tools/timeline.jpg\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003eSystemtap\u003c/b\u003e\u003cbr /\u003e\r\nsystemtap is another great tool to monitor the kernel and user space programs. systemtap isn't well supported in the ARM platform, and a few patches are required in order to install systemtap ChromeOS. A few changes to help build systemtap for ChromeOS have been submitted for review, and hopefully to be merged to the upstream very soon.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nsystemtap requires a compiler to build scripts to kernel modules. Since ChromeOS doesn't have gcc built in by default, it's easier to build the systemtap scripts on the desktop.\u003cbr /\u003e\r\nBefore we can build the scripts, we need to cross compile the kernel, and we can build the kernel as mentioned in the above.\u003cbr /\u003e\r\n\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eFEATURES\u003dnoclean USE\u003d\"systemtap\" emerge-tegra2_seaboard chromeos-kernel\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\r\n\u003cdiv\u003eThe command above builds a kernel for seaboard, and we need to enable the kernel to support systemtap\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\nAll compiled result will be in \u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e/build/tegra2_seaboard/tmp/portage/sys-kernel/chromeos-kernel-9999/work/chromeos-kernel-9999/build/tegra2_seaboard.\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eKERNEL_BUILD_DIR\u003d\u003c/span\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e/build/tegra2_seaboard/tmp/portage/sys-kernel/chromeos-kernel-9999/work/chromeos-kernel-9999/build/tegra2_seaboard\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003euse stap to generate the module code. The following command translates a systemtap script and cross compiles it into a kernel module called example.ko for the ARM platform.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003estap -v -a arm -r ${KERNEL_BUILD_DIR} -p 4 -B CROSS_COMPILE\u003darmv7a-cros-linux-gnueabi- -k example.stp -m \u003c/span\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eexample\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003ecopy the kernel module to the target device. \u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIn the target device, assume the module is placed in /mnt/stateful_partition, the following command runs the kernel module with staprun.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eSYSTEMTAP_STAPIO\u003d/usr/local/libexec/systemtap/stapio staprun /mnt/stateful_partition/\u003c/span\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003eexample\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(106,168,79)\"\u003e.ko\u003c/span\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\r\nThe systemtap website lists a list of examples:\u003cbr /\u003e\r\n\u003ca href\u003d\"http://sourceware.org/systemtap/examples/\" rel\u003d\"nofollow\"\u003ehttp://sourceware.org/systemtap/examples/\u003c/a\u003e\u003cbr /\u003e\r\nSome systemtap doc\u003cbr /\u003e\r\n\u003ca href\u003d\"http://sourceware.org/systemtap/SystemTap_Beginners_Guide/\" rel\u003d\"nofollow\"\u003eSystemTap Beginners Guide\u003c/a\u003e\u003cbr /\u003e\r\n\u003ca href\u003d\"http://sourceware.org/systemtap/tutorial/\" rel\u003d\"nofollow\"\u003eSystemtap tutorial\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003eAt some point of boot, streamline shows that both CPU and disk were idle. Therefore, a script as below was written to monitor all system calls, and print out the time a system call takes to complete. This information might tell us which processes were blocking the system at some particular moment as some system calls took several hundred milliseconds or even one second to complete. However, the problem was gone after I sync'd all software in the system, and the further investigation becomes unnecessary.\u003cbr /\u003e\u003cbr /\u003eglobal start_time\u003cbr /\u003eglobal syscall_starttimes\u003cbr /\u003e\u003cbr /\u003eprobe begin {\u003cbr /\u003e        start_time \u003d gettimeofday_us()\u003cbr /\u003e        printf (\"monitor starts at %d\\n\", start_time)\u003cbr /\u003e}\u003cbr /\u003e\u003cbr /\u003eprobe syscall.* {\u003cbr /\u003e        if (pid() !\u003d stp_pid()) {\u003cbr /\u003e                syscall_starttimes[name, tid()] \u003d gettimeofday_us()\u003cbr /\u003e        }\u003cbr /\u003e}\u003cbr /\u003e\u003cbr /\u003eprobe syscall.*.return {\u003cbr /\u003e        if (pid() !\u003d stp_pid()) {\u003cbr /\u003e                curr_time \u003d gettimeofday_us()\u003cbr /\u003e                delta \u003d curr_time - syscall_starttimes[name, tid()]\u003cbr /\u003e                if (curr_time \u0026gt; start_time + 1000000 * 3)\u003cbr /\u003e                        printf (\"%d: %s (%d:%d) returns from %s, takes %d\\n\", curr_time - start_time, execname(), pid(), tid(), name, delta)\u003cbr /\u003e                delete syscall_starttimes[name,tid()]\u003cbr /\u003e        }\u003cbr /\u003e}\u003cbr /\u003e\u003cbr /\u003eprobe timer.s(10) {\u003cbr /\u003e        print (\"have monitored for 10 seconds\\n\")\u003cbr /\u003e        exit()\u003cbr /\u003e}\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003eNOTE: systemtap isn't built in the dev image or the test image by default.\u003c/b\u003e Right now, we need to apply the following patch manually in order to build systemtap into the dev image.\u003cbr /\u003egit fetch http://gerrit.chromium.org/gerrit/p/chromiumos/overlays/chromiumos-overlay refs/changes/74/5274/4 \u0026amp;\u0026amp; git checkout FETCH_HEAD\u003cbr /\u003eFurthermore, in the chroot, systemtap requires a high version of elfutils, but its dependency check is broken, so when running systemtap, please make sure elfutils-0.152 is installed, which has been tested to work OK with systemtap 1.5. Without a higher version of elfutils, systemtap might have an error such as \u003cbr /\u003esemantic error: failed to retrieve return value location for vfs_write\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/monitoring-tools"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1710322288975155810"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1710322288975155810"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1710322288975155810"}],"author":[{}],"sites$pageName":{"$t":"monitoring-tools"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/239991793112250384"},"published":{"$t":"2011-08-21T20:14:27.314Z"},"updated":{"$t":"2018-10-10T14:49:29.332Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-21T20:14:27.314Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"timeline.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/239991793112250384"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1710322288975155810"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/monitoring-tools/timeline.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/239991793112250384"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/239991793112250384"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/239991793112250384"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/239991793112250384"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"Wyl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1487702322549217695"},"published":{"$t":"2012-07-25T23:31:57.323Z"},"updated":{"$t":"2018-10-10T14:49:12.870Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T14:49:12.870Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"random notes by quiche@"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eTracing wireless API events:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e# cd \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(34,34,34);background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(34,34,34);background-color:transparent\"\u003e/sys/kernel/debug/tracing\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# echo 1 \u0026gt; events/cfg80211/enable  # requires wireless-3.8 or newer\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# echo 1 \u0026gt; events/mac80211/enable  # available with wireless-3.4\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u0026lt;do some stuff here\u0026gt;\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# cat trace\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eExample output\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# tracer: nop\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# entries-in-buffer/entries-written: 12/12   #P:4\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#                              _-----\u003d\u0026gt; irqs-off\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#                             / _----\u003d\u0026gt; need-resched\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#                            | / _---\u003d\u0026gt; hardirq/softirq\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#                            || / _--\u003d\u0026gt; preempt-depth\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#                            ||| /     delay\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#              | |       |   ||||       |         |\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ..s.  6636.389338: rdev_mgmt_frame_register: phy605, wdev(1), frame_type: 0xd0, reg: true \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ..s.  6636.389373: rdev_return_void: phy605\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ....  6636.389900: rdev_set_power_mgmt: phy605, netdev:mlan0(1818), enabled, timeout: -1 \u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ....  6636.394420: rdev_return_int: phy605, returned: 0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ....  6636.453881: rdev_scan: phy605\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  wpa_supplicant-427   [000] ....  6636.453925: rdev_return_int: phy605, returned: 0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  ksdioirqd/mmc1-5353  [003] ....  6636.609710: cfg80211_return_bss: 04:f0:21:05:4e:95, band: 0, freq: 2412\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  ksdioirqd/mmc1-5353  [000] ....  6640.651105: cfg80211_scan_done: aborted: false\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003eTracing cfg80211/mac80211 function calls:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003e# cd /sys/kernel/debug/tracing/\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cdiv\u003e# echo 0 \u0026gt; tracing_on\u003c/div\u003e\u003cdiv\u003e# echo \u0026gt; trace  # clear any existing data\u003c/div\u003e\u003cdiv\u003e# echo function_graph \u0026gt; current_tracer\u003c/div\u003e\u003cdiv\u003e# echo funcgraph-abstime \u0026gt; trace_options\u003c/div\u003e\u003cdiv\u003e# echo ':mod:cfg80211' \u0026gt; set_ftrace_filter\u003c/div\u003e\u003cdiv\u003e# echo ':mod:mac80211' \u0026gt;\u0026gt; set_ftrace_filter  # NOTE: two '\u0026gt;'s here\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e# echo 1 \u0026gt; tracing_on\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e# cat trace\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"4\"\u003eTracing general network events:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003e# cd /sys/kernel/debug/tracing/\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# echo 1 \u0026gt; events/net/enable\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u0026lt;do some stuff here\u0026gt;\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# cat trace\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e[...]\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e            sshd-5179  [000] ..s.  6940.442983: net_dev_queue: dev\u003deth0 skbaddr\u003ded0feb38 len\u003d114\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e            sshd-5179  [000] ..s.  6940.443025: net_dev_xmit: dev\u003deth0 skbaddr\u003ded0feb38 len\u003d114 rc\u003d0\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003eRecording a trace:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eDumping the trace by hand (\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003ecat trace\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e) works fine for manual work. But if you want a long-running trace, do this instead:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ecd /sys/kernel/debug/tracing/\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003eecho 0 \u0026gt; tracing_on\u003c/span\u003e\u003c/li\u003e\u003cli\u003eConfigure tracing by using the commands above (e.g. \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eecho 1 \u0026gt; events/net/enable\u003c/span\u003e)\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecat trace_pipe | gzip -c \u0026gt; /var/log/trace.log.gz \u0026amp;\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eecho 1 \u0026gt; tracing_on\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003ebuild\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eto see the compiler command-line for emerge/ebuild, add \u003cfont face\u003d\"courier new, monospace\"\u003eCXXFLAGS\u003d\"-print-cmdline\"\u003c/font\u003e to the\u003c/div\u003e\u003cdiv\u003eenvironment of emerge/ebuild.\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eccache\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ethe chromiumos build tools use ccache, with the cache located in /var/cache/distfiles/ccache.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eyou can inspect the cache as follows.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ CCACHE_DIR\u003d/var/cache/distfiles/ccache ccache -s\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecache directory                     /var/cache/distfiles/ccache\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecache hit (direct)                     1\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecache hit (preprocessed)               0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecache miss                             2\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecalled for link                        2\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecompile failed                         1\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003efiles in cache                         6\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003ecache size                          16.8 Mbytes\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003emax cache size                       1.0 Gbytes\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eyou can clear it with\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ CCACHE_DIR\u003d/var/cache/distfiles/ccache ccache --clear\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eif you run ccache manually (without using the build tools), CCACHE_DIR will probably not be set.\u003c/div\u003e\u003cdiv\u003ein this case, ccache will default to ~/.ccache as the cache directory.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    $ ccache --show-stats\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    cache directory                     /home/quiche/.ccache\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    cache hit (direct)                     1\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    cache hit (preprocessed)               0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    cache miss                             1\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    files in cache                         3\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    cache size                           8.5 Mbytes\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    max cache size                       1.0 Gbytes\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eWorking with mhtml files:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eBefore Ubuntu Precise:\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e$ for x in *.mhtml; do kmhtconvert -n -f $x; done\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e$ \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003efor x in */index.html; do w3m -dump $x \u0026gt; $(dirname $x).txt; done\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003eWith Ubuntu Precise:\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ for x in *.mhtml; do mu extract --save-all $x; done\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eListing branch names:\u003c/font\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e# in an existing checkout\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ git branch -a\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eChecking out a branch: see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/working-on-a-branch\"\u003eWorking on a Branch\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eEnabling verbose logging for Chrome: \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# mount / -oremount,rw\u003c/font\u003e\u003cbr /\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# echo \"vmodule\u003dnetwork_event_log\u003d1\" \u0026gt;\u0026gt; /etc/chrome_dev.conf\u003c/font\u003e\u003cbr /\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# restart ui\u003c/font\u003e\u003cbr /\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eMonitoring cellular activation:\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eenable verbose logging for Chrome (see above)\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# ff_debug +cellular+dbus+modem+portal+service\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# ff_debug --level -5\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# tail -F /var/log/chrome/chrome | logger -t chrome-main \u0026amp;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# tail -F /var/log/ui/ui.LATEST | logger -t chrome-ui \u0026amp;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# tail -F /home/chronos/user/log/chrome | logger -t chrome-user \u0026amp;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# dbus-monitor --system | logger -t dbus-monitor \u0026amp;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eResetting modem:\u003c/font\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e(see also \u003ca href\u003d\"http://support.verizonwireless.com/clc/devices/knowledge_base.html?id\u003d38519\" rel\u003d\"nofollow\"\u003ehttp://support.verizonwireless.com/clc/devices/knowledge_base.html?id\u003d38519\u003c/a\u003e)\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eNetwork Options -\u0026gt; Verizon Wireless -\u0026gt; View Account -\u0026gt; Account Overview -\u0026gt; log in -\u0026gt; cancel account\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecrosh\u0026gt; modem factory-reset 000000 y\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emake sure to do these steps in order.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMonitor mode packet capture (requires another chromebook, with a dev image):\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul style\u003d\"font-family:Tinos;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eon connected chromebook:\u003cbr /\u003eCtrl-Alt-t to open crosh\u003cbr /\u003ecrosh\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e network_diag --wifi\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ectrl-m to open file manager\u003cbr /\u003eopen most recent “network_diagnostics” file\u003cbr /\u003e\u003cbr /\u003esearch for “BSS … associated”\u003cbr /\u003eremember “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efreq\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” for next step\u003cbr /\u003e\u003cbr /\u003elook for “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esecondary channel offset\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” and “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSTA channel width\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” under “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eHT operation\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e”\u003cbr /\u003eif “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSTA channel width\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” is 20, use HT20 in next step\u003cbr /\u003eif “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSTA channel width\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” is 40, and “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esecondary channel offset\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” is “above”, use \"above\" in next step\u003cbr /\u003eif “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSTA channel width\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” is 40, and “\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003esecondary channel offset\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e” is “below”, use \"below\" in next step\u003cbr /\u003eotherwise, omit HT parameter in next step\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cul style\u003d\"font-family:Tinos;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eon capture chromebook:\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edisable wifi using UI\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecrosh\u0026gt; packet_capture --frequency \u0026lt;freq\u0026gt; --ht-location \u0026lt;above|below\u0026gt;\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cfont size\u003d\"4\"\u003eMonitoring D-Bus signals:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e$ sudo gdbus monitor --system --dest fi.w1.wpa_supplicant1 | logger -t supplicant-dbus \u0026amp;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:large;background-color:transparent\"\u003eMonitoring D-Bus calls:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eBy default, you can only monitor D-Bus signals (broadcast messages from one process to the who system)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eTo enable monitoring of method calls, run\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(38,38,38);line-height:16px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e./mod_test_image_for_dbusspy.sh -i ../build/images/${BOARD}/latest/chromiumos_test_image.bin\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont color\u003d\"#262626\" face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"line-height:16px\"\u003edbus calls will be logged in /var/log/dbusspy.log\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003chr /\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:large\"\u003eOOBE:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eHow to \u003ca href\u003d\"http://www.chromium.org/chromium-os/force-out-of-box-experience-oobe\"\u003eforce OOBE\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792873272714974581"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/obsolete/quiche-notes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1487702322549217695"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1487702322549217695"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1487702322549217695"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"quiche-notes"},"sites$revision":{"$t":"42"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6896555620642981733"},"published":{"$t":"2008-08-29T16:40:48.175Z"},"updated":{"$t":"2018-10-10T03:51:10.573Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-10T03:51:09.077Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Discussion Groups"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003cdiv class\u003d\"sites-layout-name-two-column-hf sites-layout-vbox\"\u003e\u003cdiv class\u003d\"sites-layout-tile sites-tile-name-header\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eFor general user help, please try the \u003ca href\u003d\"https://www.google.com/support/chrome/\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eGoogle Chrome Help Center\u003c/a\u003e.\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003eYou can subscribe to the following groups to get project updates and discuss the Chromium projects\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e, and to get help in developing for Chromium-based browsers\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e:\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-discuss\"\u003echromium-discuss\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\nGeneral Chromium discussion, ideas and suggestions should go here. This is a high-volume mailing list, and in general is the right list to post to as a default if you are unsure of exactly where you should post. Topical posts include items such as ideas for new features or the improvement of existing features, questions or comments around the high level design of Chromium, and other high-level topics that are not necessarily focused on the actual engineering or implementation of code.\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-os-discuss\"\u003echromium-os-discuss\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003eThis is the main group for discussing the Chromium OS project. Use this list to discuss ideas for new features, how to improve existing features, the high-level design of Chromium OS, and other topics that are not focused on the actual engineering or implementation of code.\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-2\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-extensions\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003echromium-extensions\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003eThis group is for people who are creating extensions for Chromium or Google Chrome.\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-apps\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003echromium-apps\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003eThis group is for people who are creating installable web apps for Chromium or Google Chrome.\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-html5/\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003echromium-HTML5\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\r\nThis is the group to help with questions about how to use these new APIs from HTML5 (and other standards groups) that are now available for use within Chromium and Google Chrome, the extensions framework and Google Chrome OS.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-accessibility\"\u003e\u003cb\u003echromium-accessibility\u003c/b\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003eThis group is for discussing compatibility and use of Chromium or Google Chrome with assistive technology such as screen readers.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cdiv class\u003d\"sites-layout-tile sites-tile-name-footer\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:small\"\u003eNote: On 1/21/2010 we switched our mailing lists to be hosted on chromium.org. Posts before that date for the above lists are available at \u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ca href\u003d\"https://groups.google.com/group/chromium-discuss\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003echromium-discuss\u003c/a\u003e, \u003ca href\u003d\"https://groups.google.com/group/chromium-os-discuss\"\u003echromium-os-discuss\u003c/a\u003e,\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:small\"\u003e and \u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ca href\u003d\"https://groups.google.com/group/chromium-extensions\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003echromium-extensions\u003c/a\u003e.\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003eIf you're interested in \u003cb\u003eimplementation details\u003c/b\u003e of the Chromium projects, see the \u003cb\u003etechnical discussion\u003c/b\u003e groups for \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/technical-discussion-groups\"\u003eChromium\u003c/a\u003e and \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/contact.md\"\u003eChromium OS\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/discussion-groups"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6896555620642981733"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6896555620642981733"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6896555620642981733"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"discussion-groups"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"Xil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/177279890213997066"},"published":{"$t":"2010-09-02T16:49:54.137Z"},"updated":{"$t":"2018-10-09T17:25:50.848Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-09T17:25:48.568Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Reporting Security Bugs"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe Chromium project takes security very seriously, but any complex software project is going to have some vulnerabilities. You can help us make Chromium more secure by following the guidelines below when filing security bugs against Chromium. And as an added benefit to you, following these guidelines will increase both the chance and size of the reward you could receive under the \u003ca href\u003d\"https://g.co/ChromeBugRewards\"\u003eVulnerability Rewards Program\u003c/a\u003e.\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Scope\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eScope\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-General-Guidelines\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eGeneral Guidelines\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Reporting-Crash-Bugs\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eReporting Crash Bugs\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Signs-A-Crash-Is-Not-A-Security-Bug\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eSigns A Crash Is Not A Security Bug\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Going-Above-and-Beyond\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eGoing Above and Beyond\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bug-Visibility\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eBug Visibility\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Scope\" /\u003eScope\u003c/h3\u003e\u003cdiv\u003eDo not report physically-local attacks. For example, please do not\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e report that you can compromise Chromium by installing a malicious DLL on a computer in a place where Chromium will find it and load it. Similarly, please do not \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ereport p\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eassword disclosure using the Inspect Element feature to convert the \"*******\" into the underlying text.\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:10pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo understand why, see the \u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/faq.md\"\u003eChromium Security FAQ.\u003c/a\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-General-Guidelines\" /\u003eGeneral Guidelines\u003c/h3\u003e\u003cdiv\u003eThese are the criteria that we expect from a good security bug report:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eWas filed via the \u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry?template\u003dSecurity%20Bug\"\u003esecurity template\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eContains a clear and descriptive title.\u003c/li\u003e\u003cli\u003eIncludes the Chromium/Chrome version number and \u003ca href\u003d\"https://www.chromium.org/getting-involved/dev-channel\"\u003erelease channel\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eLists the operating system, version, and service pack level of the testing platform.\u003c/li\u003e\u003cli\u003eIncludes a reproducible example of the bug, such as an attached HTML or binary file that triggers the bug when loaded into Chrome. \u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003ePlease\u003c/b\u003e make the file as small as possible and remove any content not necessary to trigger the vulnerability.\u003c/li\u003e\u003cli\u003e\u003cb\u003ePlease\u003c/b\u003e avoid dependencies on third-party libraries such as jQuery or Prototype (which can dramatically complicate the process of diagnosing a potential vulnerability).\u003c/li\u003e\u003cli\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003eFor short\u003c/b\u003e (e.g. 15 lines), text-based reproductions (eg. HTML or SVG), please include the reproduction case directly in the report text.\u003c/span\u003e\u003c/i\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-style:normal\"\u003eFor larger \u003c/b\u003eor more complex cases, please attach files directly to the bug, not in an archive.\u003c/li\u003e\u003cli\u003eIf you host a page that demonstrates the bug, \u003cb\u003eplease also attach\u003c/b\u003e the files and config needed reproduce locally.\u003c/li\u003e\u003cli\u003e\u003cb\u003eNote \u003c/b\u003ethat a screen capture or video showing the issue is largely unnecessary except in the case for security UI issues, and is not a substitute for a well-written, reproducible test case.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eProvides a brief description (where appropriate) of the nature of the bug along with any additional details required to reproduce it.\u003c/li\u003e\u003cli\u003eAvoids unnecessary commentary or hyperbole. (If you choose to provide a severity estimate please follow the criteria at \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/severity-guidelines\"\u003eSeverity Guidelines for Security Issues\u003c/a\u003e.)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Reporting-Crash-Bugs\" /\u003eReporting Crash Bugs\u003c/h3\u003e\u003cdiv\u003eIn addition to the general guidelines above, we look for the following information on bugs that trigger browser crashes or sad tabs:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWhether the crash is in the browser (application crash) or the renderer (sad tab).\u003c/li\u003e\u003cli\u003ePaste into the bug description the exception details, register state, and relevant portion of the stack trace.\u003c/li\u003e\u003cul\u003e\u003cli\u003eGeneral crash reporting information is available at \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/reporting-crash-bug\"\u003eReporting a Crash Bug\u003c/a\u003e.\u003c/li\u003e\u003cli\u003ePlatform specific debugger configuration (including instructions on setting up symbols) is available for \u003ca href\u003d\"https://www.chromium.org/developers/how-tos/debugging\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eWindows\u003c/a\u003e, \u003ca href\u003d\"https://www.chromium.org/developers/debugging-on-os-x\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eMac OS X\u003c/a\u003e, and \u003ca href\u003d\"https://code.google.com/p/chromium/wiki/LinuxDebugging\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eLinux\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eIf crash reporting is enabled, please provide your \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/reporting-crash-bug\"\u003eclient ID\u003c/a\u003e.\u003c/li\u003e\u003cli\u003ePlease ensure that \u003cb\u003eall stack traces include symbols\u003c/b\u003e.\u003c/li\u003e\u003c/ul\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Signs-A-Crash-Is-Not-A-Security-Bug\" /\u003eSigns A Crash Is Not A Security Bug\u003c/h4\u003e\u003c/div\u003e\u003cdiv\u003eGenerally, we do not consider a denial of service (DoS) issues to be security vulnerabilities. Examples of these bug classes include: consistent fixed-offset \u003ca href\u003d\"https://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer\" rel\u003d\"nofollow\"\u003eNULL pointer dereferences\u003c/a\u003e, \u003ca href\u003d\"https://blogs.technet.com/b/srd/archive/2009/01/28/stack-overflow-stack-exhaustion-not-the-same-as-stack-buffer-overflow.aspx\" rel\u003d\"nofollow\"\u003ecall stack overflows (stack exhaustion)\u003c/a\u003e, and \u003ca href\u003d\"https://en.wikipedia.org/wiki/Out_of_memory\" rel\u003d\"nofollow\"\u003eout of memory (OOM) errors\u003c/a\u003e. Some of these crashes are valid bugs, and should be reported; however, they are not security bugs and should be filed through the \u003ca href\u003d\"https://code.google.com/p/chromium/issues/entry\"\u003enormal defect template\u003c/a\u003e.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Going-Above-and-Beyond\" /\u003eGoing Above and Beyond\u003c/h3\u003e\u003cdiv\u003eWhile we don't expect security vulnerability reporters to provide us any of the following information, we certainly find it extremely helpful and would take it into consideration when determining whether or not a particular report qualified for a larger award:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAn extremely clear and well-reduced test case demonstrating the vulnerability.\u003c/li\u003e\u003cli\u003eAn accurate analysis of the exact nature of a crash (e.g. identifying the reason for and location of a premature pointer deletion in a use-after-free vulnerability).\u003c/li\u003e\u003cli\u003eAn explanation of a broader vulnerability or recurring vulnerable pattern associated with the reported bug (e.g. noting that a vulnerability arises in more than one location due to a common misuse pattern on a particular class).\u003c/li\u003e\u003cli\u003eHelpful guidance for fixing the vulnerability, or providing an effective fix as part of the reporting process.\u003c/li\u003e\u003cli\u003eIdentifying any particularly interesting or impactful issue that goes beyond the scope of a single report.\u003c/li\u003e\u003cli\u003eAny noteworthy cooperation in the reporting and resolution that goes significantly beyond the normal reporting guidelines.\u003c/li\u003e\u003cli\u003eWe reward more where the reporter \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:7038197cc11fab4a\" class\u003d\"disabled\"\u003eprovides a good analysis demonstrating probable exploitability\u003c/a\u003e.\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Bug-Visibility\" /\u003e\u003cfont size\u003d\"3\"\u003eBug Visibility\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eThe visibility of security bugs is restricted until a fix has been widely deployed.  For more information see the \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/faq.md#TOC-Can-you-please-un-hide-old-security-bugs-\" style\u003d\"font-size:10pt;text-decoration:none;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSecurity FAQ\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/reporting-security-bugs"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/177279890213997066"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/177279890213997066"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/177279890213997066"}],"author":[{"name":{"$t":"Justin Schuh"},"email":{"$t":"jschuh@chromium.org"}}],"sites$pageName":{"$t":"reporting-security-bugs"},"sites$revision":{"$t":"37"}},{"gd$etag":"\"Wil7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2375072617997205178"},"published":{"$t":"2015-03-16T22:28:21.461Z"},"updated":{"$t":"2018-10-08T17:36:39.385Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-08T17:36:36.739Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Control Flow Integrity"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eWe are planning to deploy Clang's \u003ca href\u003d\"http://clang.llvm.org/docs/ControlFlowIntegrity.html\" rel\u003d\"nofollow\"\u003econtrol flow integrity\u003c/a\u003e mechanisms in Chrome.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe current status:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eCFI for virtual calls is enabled for the official Chrome on Linux x86-64 (M54 and newer).\u003c/li\u003e\u003cli\u003eCFI for indirect (C-style) calls is enabled for the official Chrome on Linux x86-64 (M68 and newer).\u003c/li\u003e\u003cli\u003eChrome is bad-cast clean, and we have a \u003ca href\u003d\"https://ci.chromium.org/p/chromium/builders/luci.chromium.ci/Linux%20CFI\"\u003ebot\u003c/a\u003e on chromium.memory that keeps it that way\u003c/li\u003e\u003cli\u003eWe're working on additional compiler improvements to allow deploying CFI on more platforms.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo build Chrome with control flow integrity for virtual calls, indirect calls, and bad casts (Linux x86_64 only):\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003e     \u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cb\u003egn gen \u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003eout/cfi '--args\u003dis_debug\u003dfalse is_cfi\u003dtrue use_cfi_icall\u003dtrue \u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"white-space:pre;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e\u003cb\u003euse_cfi_cast\u003dtrue use_thin_lto\u003dtrue\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:courier new,monospace;background-color:transparent;font-size:13.3333px\"\u003e' --check\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003e     n\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003einja -C out/cfi chrome  # Chrome will take 6 minutes or so to link.\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eBuilding with additional diagnostics:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e    \u003cb\u003egn gen \u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003eout/cfi-diag '--args\u003dis_debug\u003dfalse is_cfi\u003dtrue \u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003cb style\u003d\"background-color:transparent;font-family:courier new,monospace;font-size:13.3333px\"\u003euse_cfi_icall\u003dtrue \u003c/b\u003e\u003cb style\u003d\"background-color:transparent;font-family:courier new,monospace;font-size:small;white-space:pre\"\u003euse_cfi_cast\u003dtrue \u003c/b\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt;font-family:courier new,monospace\"\u003euse_cfi_diag\u003dtrue use_thin_lto\u003dtrue' --check\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003e    n\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003einja -C out/cfi-diag chrome  # Chrome will take 6 minutes or so to link.\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003eThe deployment is being tracked here:\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e  Meta bug: \u003ca href\u003d\"http://crbug.com/701937\"\u003ecrbug.com/701937\u003c/a\u003e\u003cbr /\u003e\u003cdiv\u003e  Linux:  \u003ca href\u003d\"http://crbug.com/464797\"\u003ecrbug.com/464797\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e  Android: \u003ca href\u003d\"http://crbug.com/469376\"\u003ecrbug.com/469376\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e  ChromeOS: \u003ca href\u003d\"http://crbug.com/537386\"\u003ecrbug.com/537386\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Diagnosing-problems-with-the-CFI-instrumentation\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"4\"\u003eDiagnosing problems with the CFI instrumentation\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003eBy default, a program compiled with CFI will crash with SIGILL if it detects a CFI violation.\u003c/div\u003e\u003cdiv\u003eFor better error messages (but not for production use) \u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eadd \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003cb\u003euse_cfi_diag\u003dtrue\u003c/b\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e to your \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003cb\u003eargs.gn\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Indirect-call-failures\" /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eIndirect call failures\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eCFI indirect call (cfi-icall) failures are primarily caused by either bad functions casts or dynamically resolved function pointers:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eCFI-icall checks that a function pointer points to a function matching the function pointer type. Casting function pointers breaks that check and such function pointer casts should be eliminated. Third party libraries that make significant use of such casts to change pointer types may potentially be resolved using \u003ca href\u003d\"https://clang.llvm.org/docs/ControlFlowIntegrity.html#fsanitize-cfi-icall-generalize-pointers\" rel\u003d\"nofollow\"\u003etype generalization\u003c/a\u003e, like \u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/938494\"\u003eso\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eCFI-icall function pointer checks are optimized to execute quickly at the expense of not being able to check dynamically resolved function pointers, e.g. pointers resolved through the use of dlsym() or GetProcAddress(). In order to provide a security guarantee similar to CFI-icall for dynamically resolved function pointers, e.g. that the pointer can not be maliciously modified to an arbitrary pointer, the pointer can be placed in read-only memory (base::ProtectedMemory) and be called without cfi-icall checking (base::UnsanitizedCfiCall), like \u003ca href\u003d\"https://chromium-review.googlesource.com/c/chromium/src/+/1000426\"\u003eso\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overhead-only-tested-on-x64-\" /\u003eOverhead (only tested on x64)\u003c/h2\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e- CPU overhead is \u0026lt; 1%\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e- Code size overhead is 5%-9%\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e- RAM overhead is a small constant (read-only tables inside the binary shared between all chrome processes)\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Trophies-bugs-found-or-prevented-\" /\u003e\u003cfont size\u003d\"4\"\u003eTrophies (bugs found or prevented)\u003c/font\u003e\u003c/h2\u003e- \u003ca href\u003d\"https://crbug.com/658955\"\u003ehttps://crbug.com/658955\u003c/a\u003e - invalid cast in ProcessManagerBrowserTest.NestedURLNavigationsToAppBlocked\u003cbr /\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003c/font\u003e\u003ca href\u003d\"https://crbug.com/646615\"\u003ehttps://crbug.com/646615\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e - invalid cast in \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eblink::BytesConsumerTestUtil::TwoPhaseReader\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e- \u003ca href\u003d\"https://crbug.com/605337\"\u003ehttps://crbug.com/605337\u003c/a\u003e - invalid cast in SkTArray.h\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/600808\"\u003ehttps://crbug.com/600808\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e -\u003c/span\u003e invalid cast in PaymentRequestTest.NullShippingOptionWhenNoOptionsAvailable\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/601193\"\u003ehttps://crbug.com/601193\u003c/a\u003e -\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Geneva,arial,sans-serif;background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"2\"\u003eHeapVector::operator\u003d is deleting garbage collected elements\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/577972\"\u003ehttps://crbug.com/577972\u003c/a\u003e - improper deserialization of \u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003ecc::HeadsUpDisplayLayer\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/569102\"\u003ehttps://crbug.com/569102\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e - \u003c/span\u003einvalid cast in AutofillDialogControllerTest\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/568738\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e568738\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e -\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in CachingCorrectnessTest.ReuseImageExpiredFromExpires\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/568736\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e568736\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in AnimationTranslationUtilTest.filtersWork\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/568407\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e568407\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in TileManagerPerfTest.PrepareTiles\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/565515\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e565515\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in tile_manager_unittest.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/557969\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e557969\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in cdm_wrapper\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/557802\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e557802\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBad-cast to blink::HTMLOptionElement from blink::HTMLOptGroupElement\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/552699\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e552699\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBad-cast to webrtc::ProcessThreadImpl from invalid vptr;process_thread_impl.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/551611\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e551611\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in SafeBrowsingService::GetProtocolManagerDelegate\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e- \u003c/span\u003e\u003c/font\u003e\u003ca href\u003d\"https://crbug.com/569108\"\u003e\u003cfont size\u003d\"2\"\u003ehttps://crbug.com/569108\u003c/font\u003e\u003c/a\u003e\u003cfont size\u003d\"2\"\u003e - invalid cast in browser_plugin_guest\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/524194\"\u003ehttps://crbug.com/524194\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e -\u003c/span\u003e invalid cast in AutofillDialogControllerTest\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/541708\"\u003ehttps://crbug.com/541708\u003c/a\u003e\u003cfont style\u003d\"background-color:transparent\"\u003e - \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in net/http/http_proxy_client_socket_pool_unittest.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/520760\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e520760\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in ppapi/proxy/nacl_message_scanner.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/538952\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e538952\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBad-cast to Profile from invalid vptr;chrome_extensions_network_delegate.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/538754\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e538754\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in SkTextBlobBuilder::build\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/517959\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e517959\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003einvalid cast in sfntly/port/refcount.h\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/568891\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e568891\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003einvalid cast in HeapTest.VectorDestructorsWithVtable\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/537398\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e537398\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in blink::LifecycleNotifier\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/531664\"\u003ehttps://crbug.com/531664\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e -\u003c/span\u003e invalid cast in list_container.h\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/528799\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e528799\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBad-cast to icu_54::UnicodeSet from icu_54::Quantifier\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/528798\"\u003ehttps://crbug.com/528798\u003c/a\u003e - Bad-cast to blink::ScriptWrappable from blink::WebGLRenderingContextBase::TypedExtensionTracker\u0026lt;blink::ANGLEInstancedArrays\u0026gt;\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/526339\"\u003ehttps://crbug.com/526339\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e -\u003c/span\u003e invalid cast in RenderFrameHostManagerTest\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/524194\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e524194\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e -\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in AutofillDialogControllerTest\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/520760\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e520760\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e -\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e Invalid cast in ppapi/proxy/nacl_message_scanner.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/520732\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e520732\u003c/span\u003e\u003c/a\u003e - Invalid cast in message_loop.cc / ToPumpIO\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/520699\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e520699\u003c/span\u003e\u003c/a\u003e - Invalid static_cast in ThreadLocalPointer::Get\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/516538\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e516538\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003einvalid cast in ChromeLauncherControllerTest\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/516528\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e516528\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e -\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in content::TestWebContents::GetMainFrame\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/516523\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e516523\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in NavigatorTestWithBrowserSideNavigation\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/516513\"\u003ehttps://crbug.com/516513\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e - \u003c/span\u003eInvalid cast in AppCacheHost::AddUpdateObserver\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/515973\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e515973\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eInvalid cast in SkTArray.h\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/515679\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e515679\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e -\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e invalid cast in GrTRecorder.h\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- \u003ca href\u003d\"https://crbug.com/515215\"\u003ehttps://crbug.com/515215\u003c/a\u003e - Invalid cast in v8::internal::compiler::Typer::Visitor::Reduce\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/514817\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e514817\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eInvalid cast in SocketsTcpUnitTest\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/513953\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e513953\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eInvalid cast in FeedbackUploaderTest\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/513816\"\u003ehttps://crbug.com/513816\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e \u003c/span\u003e- Bad cast in KeyedServiceBaseFactory\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/513425\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e513425\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eInvalid cast Event -\u0026gt; CancelModeEvent for NonCancelableEvent\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/513021\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e513021\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eInvalid cast Task -\u0026gt; RasterTask in gpu_tile_task_worker_pool.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/531057\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e531057\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eBad-cast to blink::ScriptWrappable from blink::WorkerWebSocketChannel;DOMWrapperMap.h\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- \u003c/span\u003e\u003ca href\u003d\"https://crbug.com/530432\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ehttps://crbug.com/\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e530432\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003e - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eCHECK failed: io_thread_.StartWithOptions(thread_options) in child_process.cc\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e- \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"https://crbug.com/586639\"\u003ehttps://crbug.com/586639\u003c/a\u003e - I\u003c/font\u003e\u003c/span\u003envalid cast in TabDesktopMediaListTest\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:11.726px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/control-flow-integrity"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2375072617997205178"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2375072617997205178"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2375072617997205178"}],"author":[{"name":{"$t":"Peter Collingbourne"},"email":{"$t":"pcc@chromium.org"}}],"sites$pageName":{"$t":"control-flow-integrity"},"sites$revision":{"$t":"43"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7538676290012085914"},"published":{"$t":"2015-06-11T11:02:50.752Z"},"updated":{"$t":"2018-10-08T15:15:21.838Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-08T15:15:19.925Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Password Form Styles that Chromium Understands"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Automatically-Comprehensible-Password-Forms\" /\u003eAutomatically Comprehensible Password Forms\u003c/h3\u003e\r\n\r\nYou can help ensure that browsers' and extensions' password management\r\nfunctionality can understand your site's sign-up, sign-in and change-password forms by\r\nenriching your HTML with a dash of metadata. In particular:\r\n\r\n\u003col\u003e\r\n \u003cli\u003e\r\n Add an \u003ccode\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003c/code\u003e\r\n attribute with a value of \u003ccode\u003eusername\u003c/code\u003e for usernames.\r\n \u003c/li\u003e\r\n \u003cli\u003e\r\n If you've implemented an \"\u003ca href\u003d\"https://developers.google.com/identity/toolkit/web/account-chooser#email_first\"\u003eemail first\u003c/a\u003e\"\r\n sign-in flow that separates the username and password into two separate\r\n forms, include a form field containing the username in the form\r\n used to collect the password. You can, of course, hide this field via CSS if\r\n that's appropriate for your layout.\r\n \u003c/li\u003e\r\n \u003cli\u003e\r\n Add an \u003ccode\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003c/code\u003e\r\n attribute with a value of \u003ccode\u003ecurrent-password\u003c/code\u003e for the password\r\n field on a sign-in form.\r\n \u003c/li\u003e\r\n \u003cli\u003e\r\n Add an \u003ccode\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003c/code\u003e\r\n attribute with a value of \u003ccode\u003enew-password\u003c/code\u003e for the password\r\n field on sign-up and change-password forms.\r\n \u003c/li\u003e\r\n \u003cli\u003e\r\n If you require the user to type their password twice during sign-up or password update, add\r\n the \u003ccode\u003enew-password\u003c/code\u003e \u003ccode\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003c/code\u003e\r\n attribute on both fields.\r\n \u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Sign-in-Form:\" /\u003eSign-in Form:\u003c/h4\u003e\r\n\r\n\u003cpre\u003e\u0026lt;form id\u003d\"login\" action\u003d\"login.php\" method\u003d\"post\"\u0026gt;\r\n \u0026lt;input type\u003d\"text\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"username\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"password\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"current-password\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"submit\" value\u003d\"Sign In!\"\u0026gt;\r\n\u0026lt;/form\u0026gt;\r\n\u003c/pre\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Email-First-Sign-in-Flow:\" /\u003eEmail First Sign-in Flow:\u003c/h4\u003e\r\n\r\nCollect the email:\r\n\r\n\u003cpre\u003e\u0026lt;form id\u003d\"login\" action\u003d\"login.php\" method\u003d\"post\"\u0026gt;\r\n \u0026lt;input type\u003d\"text\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"username\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"submit\" value\u003d\"Sign In!\"\u0026gt;\r\n\u0026lt;/form\u0026gt;\r\n\u003c/pre\u003e\r\n\r\nThen collect the password, but include the email as the value of a hidden form field:\r\n\r\n\u003cpre\u003e\u0026lt;style\u0026gt;\r\n #emailfield { display: none; }\r\n\u0026lt;/style\u0026gt;\r\n\u0026lt;form id\u003d\"login\" action\u003d\"login.php\" method\u003d\"post\"\u0026gt;\r\n \u0026lt;input id\u003d\"emailfield\" type\u003d\"text\" \u003cstrong\u003evalue\u003d\"me@example.test\"\u003c/strong\u003e \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"username\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"password\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"current-password\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"submit\" value\u003d\"Sign In!\"\u0026gt;\r\n\u0026lt;/form\u0026gt;\r\n\u003c/pre\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Sign-up-Form:\" /\u003eSign-up Form:\u003c/h4\u003e\r\n\r\n\u003cpre\u003e\u0026lt;form id\u003d\"login\" action\u003d\"signup.php\" method\u003d\"post\"\u0026gt;\r\n \u0026lt;input type\u003d\"text\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"username\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"password\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"new-password\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"submit\" value\u003d\"Sign Up!\"\u0026gt;\r\n\u0026lt;/form\u0026gt;\r\n\u003c/pre\u003e\r\n\r\nOr:\r\n\r\n\u003cpre\u003e\u0026lt;form id\u003d\"login\" action\u003d\"signup.php\" method\u003d\"post\"\u0026gt;\r\n \u0026lt;input type\u003d\"text\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"username\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"password\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"new-password\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"password\" \u003cstrong\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/forms.html#autofilling-form-controls:-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eautocomplete\u003c/a\u003e\u003d\"new-password\"\u003c/strong\u003e\u0026gt;\r\n \u0026lt;input type\u003d\"submit\" value\u003d\"Sign Up!\"\u0026gt;\r\n\u0026lt;/form\u0026gt;\u003c/pre\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Related-advice\" /\u003eRelated advice\u003c/h3\u003e\u003cdiv\u003eFurther tips beyond just autocomplete attributes are listed in the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/create-amazing-password-forms\"\u003eCreate Amazing Password Forms page\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003eThere are also useful \u003ca href\u003d\"https://developers.google.com/web/updates/2015/06/checkout-faster-with-autofill\"\u003eautocomplete attribute values for annotating address forms\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/form-styles-that-chromium-understands"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7538676290012085914"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7538676290012085914"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7538676290012085914"}],"author":[{"name":{"$t":"Mike West"},"email":{"$t":"mkwst@chromium.org"}}],"sites$pageName":{"$t":"form-styles-that-chromium-understands"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8690603394983355094"},"published":{"$t":"2017-09-28T10:54:33.965Z"},"updated":{"$t":"2018-10-08T15:13:24.192Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-08T15:13:22.350Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Create Amazing Password Forms"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Web-browsers-and-other-agents-such-as-password-managers-try-to-make-the-process-of-filling-out-forms-as-convenient-to-users-as-possible-to-save-time-and-frustration.-However-good-they-are-at-interpreting-web-pages-however-there-are-always-a-few-things-you-\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb browsers (and other agents, such as password managers) try to make the process \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eof filling out forms as convenient to users as possible, to save time and frustration. However good they are at interpreting web pages, however, there are always a few things you, as a web developer, can make sure to do, to ensure the best experience for your users, by making your web pages accessible.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Group-related-fields-in-a-single-form\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eGroup related fields in a single form\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Make-sure-that-each-authentication-process-registration-login-or-change-password-is-grouped-together-in-a-single-form-element.-Don-t-combine-multiple-processes-like-registration-and-login-or-skip-the-form-element.\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eMake sure that each authentication process (registration, login or change password) is grouped together in a single \u003c/span\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eform\u0026gt;\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e element. Don’t combine multiple processes (like registration and login), or skip the \u003c/span\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eform\u0026gt;\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e element.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Use-autocomplete-attributes\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUse autocomplete attributes\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Autocomplete-attributes-help-password-managers-to-infer-the-purpose-of-a-field-in-a-form-saving-them-from-accidentally-saving-or-autofilling-the-wrong-data.-A-little-annotation-can-go-a-long-way:-some-common-values-for-text-fields-are-username-current-pass\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofilling-form-controls%3A-the-autocomplete-attribute\" rel\u003d\"nofollow\"\u003eAutocomplete\u003c/a\u003e attributes help password managers to infer the purpose of a field in a form, saving them from accidentally saving or autofilling the wrong data. A little annotation can go a long way: some common values for text fields are “username”, “current-password” (login forms and change password forms) and “new-password” (registration and change password forms). See a \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/form-styles-that-chromium-understands\"\u003edetailed write-up\u003c/a\u003e with examples.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFields that are not passwords, but should be obscured, such as credit card numbers, may also have a \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003etype\u003d\"password\"\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e attribute, but should contain the relevant autocomplete attribute, such as \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003e\"cc-number\"\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003e\"cc-csc\"\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Make-sure-form-submission-is-clear\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eMake sure form submission is clear\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Password-managers-need-some-indication-that-a-form-has-been-submitted.-Try-to-make-sure-your-web-page-does-one-of-the-following-on-form-submission:Performs-a-navigation-to-another-page.Emulates-a-navigation-with-History.pushState-or-History.replaceState-an\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ePassword managers need some indication that a form has been submitted. Try to make sure your web page does one of the following on form submission:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ePerforms a navigation to another page.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eEmulates a navigation with \u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/API/History_API\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003eHistory.pushState\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003eHistory.replaceState\u003c/font\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, and removes the password form completely.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIn addition, if you perform an asynchronous request with \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eXMLHttpRequest\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-family:Consolas;color:rgb(51,51,51);background-color:transparent;font-weight:400;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\"\u003e\u003ca href\u003d\"https://developers.google.com/web/updates/2015/03/introduction-to-fetch\" target\u003d\"_blank\"\u003efetch\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, make sure that the success status is correctly set in the response headers.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Use-hidden-fields-for-implicit-information\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUse hidden fields for implicit information\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-On-some-forms-it-is-not-necessary-to-include-some-information-which-might-be-obvious-from-the-context-for-example-the-username-field-in-a-change-password-form-.-However-this-information-is-still-useful-to-password-managers-there-may-be-multiple-accounts-as\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOn some forms, it is not necessary to include some information, which might be obvious from the context (for example, the username field in a change password form). However, this information is still useful to password managers (there may be multiple accounts associated with a web site, for example), so include a hidden input field containing this information even if it is not directly necessary for your form.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Don-t-try-to-fool-the-browser\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eDon’t try to fool the browser\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Password-managers-either-built-into-the-browser-or-external-are-designed-to-ease-the-user-experience.-Inserting-fake-fields-using-incorrect-autocomplete-attributes-or-taking-advantage-of-the-weaknesses-of-the-existing-password-managers-simply-leads-to-frus\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ePassword managers (either built into the browser, or external) are designed to ease the user experience. Inserting fake fields, using incorrect autocomplete attributes or taking advantage of the weaknesses of the existing password managers simply leads to frustrated users.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Follow-existing-conventions\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFollow existing conventions\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Being-different-just-for-the-sake-of-it-is-not-worth-it.-This-will-lead-to-a-poor-user-experience-all-round.-This-means-for-example-not-navigating-to-a-separate-web-page-if-a-login-failed:-this-is-unexpected-and-disorienting-to-both-the-user-and-the-passwo\" /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBeing different just for the sake of it is not worth it. This will lead to a poor user experience all round. This means, for example, not navigating to a separate web page if a login failed: this is unexpected, and disorienting to both the user and the password manager.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.2;margin-top:18pt;margin-bottom:12pt;border-bottom:solid #eeeeee 0.75pt;background-color:#ffffff;padding:0pt 0pt 5.1pt 0pt\"\u003e\u003ca name\u003d\"TOC-Follow-HTML-guidelines\" /\u003e\u003cspan style\u003d\"font-size:17pt;font-family:Roboto;color:#333333;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFollow HTML guidelines\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Web-browsers-are-designed-with-the-HTML-specification-in-mind-and-going-against-it-can-lead-to-unexpected-issues-with-your-web-page.-This-means:Element-id-attributes-should-be-unique:-no-two-elements-should-have-the-same-id.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:12pt\"\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb browsers are designed with the HTML specification in mind, and going against it can lead to unexpected issues with your web page. This means:\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eElement \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Consolas;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eid\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e attributes should be unique: no two elements should have the same \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Consolas;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eid\u003c/span\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Roboto;color:rgb(51,51,51);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody /\u003e\u003c/table\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/create-amazing-password-forms"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8690603394983355094"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8690603394983355094"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8690603394983355094"}],"author":[{"name":{"$t":"Vadym Doroshenko"},"email":{"$t":"dvadym@chromium.org"}}],"sites$pageName":{"$t":"create-amazing-password-forms"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1655273655316605334"},"published":{"$t":"2018-10-08T09:39:06.181Z"},"updated":{"$t":"2018-10-08T10:03:13.251Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-08T10:03:11.196Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chamelium USB Audio"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Background\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eBackground\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Needed-equipment-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eNeeded equipment \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Setup-Steps\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSetup Steps\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recover-Steps\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eRecover Steps\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\u003cdiv\u003eUSB audio supports multi-channel and higher precision playback / capture functionality. This document tells you about how to use chamelium with external USB audio devices.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Needed-equipment-\" /\u003eNeeded equipment \u003c/h2\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eAn USB audio device\u003c/li\u003e\u003cli\u003eType-A USB to mini-USB converter \u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Setup-Steps\" /\u003eSetup Steps\u003c/h2\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eRun command \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ touch /etc/default/.usb_host_mod\u003c/font\u003e and reboot chamelium.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eRun command \u003cfont face\u003d\"courier new, monospace\"\u003e$ modprobe snd-usb-audio\u003c/font\u003e to enable USB audio module.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ePlug in a USB audio device in the \u003cb\u003e\u003ci\u003emiddle\u003c/i\u003e\u003c/b\u003e mini-USB port (with the converter) and use command \u003cfont face\u003d\"courier new, monospace\"\u003e$ aplay -l\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e (\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ arecord -l \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003efor microphone) to check if the device is plugged in.\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTest your USB audio device by the following command\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e$ arecord -f dat /tmp/test.wav \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e(Test capture function)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e$ aplay -f dat /tmp/test.was \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e(Test playback function)\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Recover-Steps\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003e\u003cb\u003eRecover Steps\u003c/b\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eRun command \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003e$ rm /etc/default/.usb_host_mod\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e and reboot chamelium\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/chamelium-usb-audio"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1655273655316605334"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1655273655316605334"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1655273655316605334"}],"author":[{"name":{"$t":"Chih-Yang Hsia"},"email":{"$t":"paulhsia@chromium.org"}}],"sites$pageName":{"$t":"chamelium-usb-audio"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8192282038602145419"},"published":{"$t":"2016-12-28T08:03:51.531Z"},"updated":{"$t":"2018-10-08T07:07:22.980Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-08T07:07:20.575Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chamelium Audio Board"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Components\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eComponents\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bootstrap\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eBootstrap\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Setup-Chamelium-Info\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eSetup Chamelium Info\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Run-the-test\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eRun the test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Test-output-input-devices-basic-function\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eTest output/input devices basic function\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Output-audio-devices\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eOutput audio devices\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Input-audio-devices\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eInput audio devices\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Advanced-tests\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eAdvanced tests\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003e\u003cfont size\u003d\"4\"\u003eIntroduction\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eChamelium audio board routes audio between four endpoints with two stereo audio buses:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eDUT device headphone jack\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eChamelium FPGA board line-out/line-in\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ePeripheral speaker/microphone\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eBluetooth audio module\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eIt helps Chamelium automate audio testing including:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e3.5mm headphone\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e3.5mm external microphone\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eOnboard internal speaker\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eOnboard internal microphone\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eBluetooth A2DP playback\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eBluetooth HSP/HFP playback\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eBluetooth HSP/HFP record\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Components\" /\u003e\u003cfont size\u003d\"4\"\u003eComponents\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eChamelium\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cimg alt\u003d\"AB_2.jpg\" height\u003d\"274\" src\u003d\"https://lh6.googleusercontent.com/J7i4-sT2ydPrJmJQo1IZ-e_0PUmoN0R_rXN-1QLIMLDaUIlUfeLj9ZZVe2GgvjhoatKCLu9S-w4iLn8nyxZVVtBvEcKNogcUMgS-9YCHhThkHhem-sSRYnPfeD-F4tNziOghxMaU\" style\u003d\"background-color:transparent;font-family:Arial;font-size:14.6667px;white-space:pre-wrap;border:none\" width\u003d\"400\" /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAudio Board Block Diagram\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/chamelium-audio-board/Chameleon%20Audio%20-%20New%20Page%20%284%29.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"283\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1483682014247/chromium-os/testing/chamelium-audio-board/Chameleon%20Audio%20-%20New%20Page%20%284%29.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv /\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAudio Board\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cimg alt\u003d\"AB_1.jpg\" height\u003d\"308\" src\u003d\"https://lh5.googleusercontent.com/OyD9hcw981gB6wUOTVHdweNJAV28gvT9hBp5wiFxnv80SXrfFr0l43tmMqFicK-XM6Mbqn8MOsCme7IOAVkMxr1fwlolWN7IKNP_wpfeDa9g_S0qub2SQMe4EZjgtfRNvX3jp54P\" style\u003d\"background-color:transparent;font-family:Arial;font-size:14.6667px;white-space:pre-wrap;border:none\" width\u003d\"400\" /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eTwo 3-ring (TRS) audio jack cables\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eOne 4-ring (TRRS) audio jack cable\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eOne serial ribbon cable (connecting CN4 on audio board with J13_LTC_CON on FPGA)\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003eUSB-A to mini-USB cable\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003e3-ring (TRS) 3.5mm microphone\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Bootstrap\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"4\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eBootstrap\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003eConnect audio board and FPGA board with the serial ribbon grey cable (see the assembled picture).\u003c/p\u003e\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eConnect audio board and Chamelium line-in and line-out (blue jack to blue jack, green jack to green jack) using two 3.5mm 3-ring(TRS) cables.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003e\u003cfont size\u003d\"2\"\u003eFor audio jack external audio - connect tested device with audio board using 3.5mm 4-ring (TRRS) cable.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003e\u003cfont size\u003d\"2\"\u003eFor USB audio - connect tested device with the middle USB port on FPGA (top) board.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eFor internal speaker test - connect a mono microphone (two conductor, TS connector) to the pink port on the FPGA (top) board.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003e\u003cfont size\u003d\"2\"\u003eFor internal microphone test - connect a speaker to black SPK port on audio board.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"white-space:pre-wrap;list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003eFor Bluetooth test - \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eChamelium Eth MAC and audio board BT MAC should be related in chameleon_info.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:14.6667px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Setup-Chamelium-Info\" /\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont size\u003d\"4\"\u003eSetup Chamelium Info\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan\u003e\u003cfont size\u003d\"2\"\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUse the interactive script ~/trunk/src/platform/chameleon/client/test_server\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to connect to chameleond server.\r\n~/trunk/src/platform/chameleon/client/test_server --chameleon_host\u003d\u0026lt;chameleon ip\u0026gt;\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGet the MAC address of chamelium:\r\n\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026gt;\u0026gt;\u0026gt; p.GetMacAddress()\r\n\u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"text-indent:0px\"\u003e\u003cspan style\u003d\"background-color:transparent;text-indent:36pt\"\u003e'94:eb:2c:00:01:27'\u003c/span\u003e\u003c/div\u003e\u003c/li\u003e\u003c/ol\u003e\u003col start\u003d\"3\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDisable the bluetooth module on audio board:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026gt;\u0026gt;\u0026gt; p.AudioBoardDisableBluetooth()\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003essh into Cros device:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003essh chromeos1-row5-rack1-host2.cros\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUse bluetoothctl to turn on adapter and start scanning\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(255,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003elocalhost\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,255);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e ~ #\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e bluetoothctl\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(106,168,79);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNEW]\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Controller 7C:7A:91:9A:EE:89 Chromebook [default]\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,255);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebluetooth\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e]# power on\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChanging power on succeeded\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,255);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebluetooth\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e]# scan on\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDiscovery started\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(241,194,50);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCHG\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e] Controller 7C:7A:91:9A:EE:89 Discovering: yes\u003c/span\u003e\u003c/p\u003e\u003col start\u003d\"6\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEnable the bluetooth module on audio board using test_server:\r\n\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u0026gt;\u0026gt;\u0026gt; p.AudioBoardResetBluetooth()\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003col start\u003d\"7\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn bluetoothctl console, check there is a new \u003cb\u003eSX3868-3Y\u003c/b\u003e device being scanned:\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(106,168,79);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNEW\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e] Device 00:1F:84:01:03:5B SX3868-3Y\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(241,194,50);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCHG\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e] Device 00:1F:84:01:03:5B RSSI: -67\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(241,194,50);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCHG\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e] Device 00:1F:84:01:03:5B RSSI: -56\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(241,194,50);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCHG\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e] Device 00:1F:84:01:03:5B RSSI: -68\u003c/span\u003e\u003c/p\u003e\u003col start\u003d\"8\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNow we know Chamelium with MAC address '94:eb:2c:00:01:27' has a Bluetooth module with MAC address ‘00:1F:84:01:03:5B’ on its audio board.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd the mapping info to client/cros/chameleon/chameleon_info.py\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_CHAMELEON_BOARD_INFO \u003d {\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        '94:eb:2c:00:00:fb': ChameleonInfo('00:1F:84:01:03:68'),\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        '94:eb:2c:00:01:2b': ChameleonInfo('00:1F:84:01:03:5E'),\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt;margin-left:36pt\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#0000ff\"\u003e'94:eb:2c:00:01:27': ChameleonInfo('00:1F:84:01:03:5B'),\r\n\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003c/p\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:14.6667px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2 style\u003d\"white-space:pre-wrap\"\u003e\u003ca name\u003d\"TOC-Run-the-test\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"4\"\u003eRun the test\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003eFor example, run basic headphone test on a squawks board 5 times:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etest_that --board\u003dsquawks --fast --debug --args\u003d\"chameleon_host\u003d$CHAMELIUM_IP\" $DUT_IP audio_AudioBasicHeadphone --iterations 5\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Test-output-input-devices-basic-function\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"4\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eTest output/input devices basic function\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Output-audio-devices\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eOutput audio devices\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent\"\u003e\u003cul\u003e\u003cfont size\u003d\"2\"\u003e\u003cli\u003eInternal speaker - audio_AudioBasicInternalSpeaker\u003c/li\u003e\u003cli\u003eHeadphone - audio_AudioBasicHeadphone\u003c/li\u003e\u003cli\u003eHDMI/DisplayPort - audio_AudioBasicHDMI\u003c/li\u003e\u003cli\u003eUSB headphone - audio_AudioBasicUSBPlayback\u003c/li\u003e\u003cli\u003eBluetooth headphone - audio_AudioBasicBluetoothPlayback\u003c/li\u003e\u003c/font\u003e\u003c/ul\u003e\u003c/span\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Input-audio-devices\" /\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eInput audio devices\u003c/font\u003e\u003c/span\u003e\u003c/h3\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cul style\u003d\"white-space:pre-wrap\"\u003e\u003cli\u003eInternal microphone - audio_AudioBasicInternalMicrophone\u003c/li\u003e\u003cli\u003eExternal microphone - audio_AudioBasicExternalMicrophone\u003c/li\u003e\u003cli\u003eUSB microphone - audio_AudioBasicUSBRecord\u003c/li\u003e\u003cli\u003eBluetooth microphone - audio_AudioBasicBluetoothRecord\u003c/li\u003e\u003c/ul\u003e\u003ch2 style\u003d\"white-space:pre-wrap\"\u003e\u003ca name\u003d\"TOC-Advanced-tests\" /\u003eAdvanced tests\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eVolume control: audio_AudioVolume\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSuspend/Resume, Reboot: audio_AudioAfterSuspend, audio_AudioAfterReboot, audio_AudioQualityAfterSuspend\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eQuality and artifacts: audio_AudioArtifacts\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eBT connection: audio_AudioBluetoothConnectionStability\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eBT playback + record: audio_AudioBasicBluetoothPlaybackRecord\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eUSB playback + record: audio_AudioBasicUSBPlaybackRecord\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eChrome media player: audio_MediaBasicVerification\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWebRTC: audio_AudioWebRTCLoopback\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eARC: audio_AudioARCPlayback, audio_AudioARCRecord\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/chamelium-audio-board"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8192282038602145419"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8192282038602145419"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8192282038602145419"}],"author":[{"name":{"$t":"Cheng-Yi Chiang"},"email":{"$t":"cychiang@chromium.org"}}],"sites$pageName":{"$t":"chamelium-audio-board"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5884788992990583966"},"published":{"$t":"2018-09-19T21:21:25.086Z"},"updated":{"$t":"2018-10-05T18:06:17.571Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-05T18:06:17.571Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5884788992990583966"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5884788992990583966"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5884788992990583966"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/lenovo-n-series/500e-Chromebook/p/88ELC1S9998\"\u003eLenovo 500e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"robo360"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1273902475575518172"},"published":{"$t":"2018-09-19T21:18:15.137Z"},"updated":{"$t":"2018-10-05T18:06:12.129Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-05T18:06:12.129Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1273902475575518172"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273902475575518172"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1273902475575518172"}],"author":[{"name":{"$t":"Vineeth Starly"},"email":{"$t":"vineeths@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2018-03-01"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.lenovo.com/us/en/laptops/lenovo/lenovo-n-series/100e-Chromebook/p/88ELC1S9999\"\u003eLenovo 100e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"robo"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5343931225353560840"},"published":{"$t":"2018-10-03T22:04:04.941Z"},"updated":{"$t":"2018-10-03T22:04:04.941Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-03T22:04:04.941Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7582987878577786924"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5343931225353560840"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5343931225353560840"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5343931225353560840"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Toshiba Satellite M200"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":""},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":""},{"index":"F","name":"Comments \u0026 Caveats","$t":"Intel Core 2 Duo + inbuilt Intel Graphics Media Accelerator. Sound \u0026 WebCam works too."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":""}]},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1529733918287523195"},"published":{"$t":"2013-03-14T19:08:16.309Z"},"updated":{"$t":"2018-10-03T20:22:16.059Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-03T20:22:13.476Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Server Side Test for Chromium OS Autotest Codelab"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\r\n\u003cb\u003e\r\n\u003cb style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman\"\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\r\n\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-References\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eReferences\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Prerequisite\"\u003e\u003cstrong\u003e3 \u003c/strong\u003ePrerequisite\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Difference-between-client-and-server-test\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eDifference between client and server test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Create-a-new-server-side-test\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eCreate a new server side test\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Syntax-and-style-guide\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eSyntax and style guide\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-1.-Name-your-test\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003eStep 1. Name your test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-2.-Create-a-barebone-server-side-test\"\u003e\u003cstrong\u003e5.3 \u003c/strong\u003eStep 2. Create a barebone server side test\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-2.1.-Create-a-Control-file\"\u003e\u003cstrong\u003e5.3.1 \u003c/strong\u003eStep 2.1. Create a Control file\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-2.2.-Create-a-test-wrapper\"\u003e\u003cstrong\u003e5.3.2 \u003c/strong\u003eStep 2.2. Create a test wrapper\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-3.-Running-the-server-side-test\"\u003e\u003cstrong\u003e5.4 \u003c/strong\u003eStep 3. Running the server-side test\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Run-Autotest-manually\"\u003e\u003cstrong\u003e5.4.1 \u003c/strong\u003eRun Autotest manually\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Add-test-to-an-existing-test-suite\"\u003e\u003cstrong\u003e5.4.2 \u003c/strong\u003eAdd test to an existing test suite\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.-Implement-test-logic-in-test-wrapper\"\u003e\u003cstrong\u003e5.5 \u003c/strong\u003eStep 4. Implement test logic in test wrapper\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.1.-Import-modules-useful-for-Chromium-OS-specific-test\"\u003e\u003cstrong\u003e5.5.1 \u003c/strong\u003eStep 4.1. Import modules useful for Chromium OS specific test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.3.-Get-Set-brightness\"\u003e\u003cstrong\u003e5.5.2 \u003c/strong\u003eStep 4.3. Get/Set brightness\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.4.-Actions-being-taken-during-the-test\"\u003e\u003cstrong\u003e5.5.3 \u003c/strong\u003eStep 4.4. Actions being taken during the test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.5.-Disable-ALS-Auto-Light-Sensor-\"\u003e\u003cstrong\u003e5.5.4 \u003c/strong\u003eStep 4.5. Disable ALS(Auto Light Sensor)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.6.-Run-test-and-validate-test-results\"\u003e\u003cstrong\u003e5.5.5 \u003c/strong\u003eStep 4.6. Run test and validate test results\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Step-4.7.-Cleanup\"\u003e\u003cstrong\u003e5.5.6 \u003c/strong\u003eStep 4.7. Cleanup\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Verify-Test-by-Running-Autotest-Manually\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eVerify Test by Running Autotest Manually\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Possible-failure-scenarios\"\u003e\u003cstrong\u003e7 \u003c/strong\u003ePossible failure scenarios\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Device-failed-to-reboot\"\u003e\u003cstrong\u003e7.1 \u003c/strong\u003eDevice failed to reboot\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003c/b\u003e\u003c/b\u003e\r\n\u003cbr /\u003e\r\n\u003ch2 style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-References\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eReferences\u003c/span\u003e\u003c/h2\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/docs/best-practices.md\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest Best Practices\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq#TOC-Writing-Autotests\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWriting Autotests\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://wiki.corp.google.com/twiki/bin/view/Codelab/WritingAutotestTests\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCodelab for Writing an Autotest Test\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e - This is a codelab teaching you how to write a generic test for Autotest.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-user-doc\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest for Chromium OS developers\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium OS Developer Guide\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003c/h2\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn this codelab, you will build a server-side Autotest to test if the backlight brightness is restored to the original value on a device after the following operations:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;display:inline!important\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e user is logged out and logged back in\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edevice is suspended and resumed\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Prerequisite\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePrerequisite\u003c/span\u003e\u003c/h2\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis Codelab is for Chromium OS developers and testers to learn how to write a server side Autotest. Assumptions:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYou know the Python programming language.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYou have a device under test (DUT) with a test image installed. See \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Installing-Chromium-OS-on-your-Device\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium OS Developer Guide\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for details.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYou have Chromium OS development environment setup, see \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Get-the-Source\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium OS Developer Guide\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for details.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eObjectives\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBy the end of this lab, you will know how to:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWrite Chromium OS server side Autotest in Python\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eManually run the server side Autotest against a DUT\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutomatically run test as part of a suite\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Difference-between-client-and-server-test\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDifference between client and server test\u003c/span\u003e\u003c/h2\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest has a notion of both client-side tests and server-side tests. All tests are managed by an Autotest server machine that is typically the machine where \u003ca href\u003d\"http://go/cros-test_that\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003etest_that\u003c/a\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eis invoked. test_that (can be found in folder scripts) is a script to run autoserv process which deploys and executes tests on remote machines.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode in a client-side test runs only on the device under test (DUT), and as such isn’t capable of maintaining state across reboots, handling a failed suspend/resume, or the like.  If possible, an Autotest should be written as a client-side test, as it’s simpler and more reusable. Code lab for client side test can be found \u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/test-code-labs/autotest-client-tests\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA ‘server’ test runs on the Autotest server, and gets assigned a DUT, just like a client-side test.  It can use various Autotest primitives (and library code written by the CrOS team) to manipulate that device.  Most, if not all, tests that use \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/servo\"\u003eServo\u003c/a\u003e or remote power management should be written as server-side tests. As a good example, if the DUT needs to be rebooted during the test, it should be a server-side test. \u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTests are located in 4 locations in the chromeos_public \u003c/span\u003e\u003ca href\u003d\"https://cs.corp.google.com/#chromeos_public/src/third_party/autotest/files/\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethird_party/autotest/files/\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e tree:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eclient/site_tests - These are where most tests live. These are client tests that are Chromium OS specific.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eclient/tests - These are client tests that come from upstream Autotest, and most are general Linux tests (not Chromium OS specific).\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eserver/site_tests - These are server tests that are Chromium OS specific.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eserver/tests - These are server tests that are general Linux tests (not Chromium OS specific).\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDecide if your test is a client or server test and choose the appropriate directory from the above. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Create-a-new-server-side-test\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCreate a new server side test\u003c/span\u003e\u003c/h2\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://github.com/autotest/autotest/wiki/AddingTest\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eAdding a test\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e involves putting a control file and a properly-written test wrapper in the right place in the source tree.  There are \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-best-practices#TOC-Writing-tests\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003econventions\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e that must be followed, and a\u003c/span\u003e\u003ca href\u003d\"https://github.com/autotest/autotest/wiki/AutotestApi\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(0,0,0);text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003evariety of primitives\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eavailable for use.  When writing any code, whether client-side test, server-side test, or library, have a strong bias towards using\u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/existing-autotest-utilities\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(0,0,0);text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest utility code\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.  This keeps the codebase consistent and avoids duplicated effort.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn the subsections below, we will discuss the detail of following topics:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSyntax and style guide.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode for a barebone server side test.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eHow to manually run a server side test on DUT.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode to implement the test logic for this exercise.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Syntax-and-style-guide\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSyntax and style guide\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBefore we start writing any code, it’s a good idea to understand and follow the Python coding style enforced in Chromium OS project. For Autotest code in Chromium OS project, the Python coding style must follow the coding style specified \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eat the top level of the \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e repo. This style adds a few additions to \u003c/span\u003e\u003ca href\u003d\"http://www.python.org/dev/peps/pep-0008/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePEP-8\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e style guide, e.g., formatting on comments and Docstrings. You may also consider to follow \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/python-style-guidelines\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePython Style Guidelines in Chromium Projects\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, but coding style defined in Autotest repo and \u003c/span\u003e\u003ca href\u003d\"http://www.python.org/dev/peps/pep-0008/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePEP-8\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e style guide must take precedence.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSome basic rules include:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUse 4 spaces instead of tab.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUse the % operator for formatting strings\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRead \u003c/span\u003e\u003ca href\u003d\"http://www.python.org/dev/peps/pep-0008/#indentation\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethis\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e about alignment for function calls with multiple line arguments.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003elower_case_with_underscores for local variable, function and method names.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eCapitalizedWords for class names\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e__double_leading_underscore for private class attribute name.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eUPPER_CASE_WITH_UNDERSCORES for static public class attribute name.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eSeparate top-level function and class definitions with two blank lines.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo extra space at the end of a line. \u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eLimit all lines to a maximum of 80 characters.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eUse single quote for strings if possible.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eEnd comment with period.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/developers/coding-style\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eHere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is another resources talking about coding style, including languages other than Python. Keep in mind that the best practice is to keep the test file in pure Python i.e. one should avoid “shelling out” and generally use Python instead of tools like awk and grep.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-1.-Name-your-test\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 1. Name your test\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCreate a folder in “src/third_party/autotest/files/server/site_tests/”. Name the folder with the test name, which is “power_MyBacklightTest”.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo name the test properly, first you need to decide the area wherein your test falls. It should be something like “power”, \"platform\", or \"network\" for instance. Take a look at the folder names in client/site_tests and server/site_tests, you can find some sample test area, and choose one area that’s proper for your test. This name is used to create the test name: e.g. \"network_UnplugCable\". Create a directory for your test at $(TEST_ROOT)/$(LOWERCASE_AREA)_$(TEST_NAME).\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTry to find an example test that does something similar and copy it.  You will create at least 2 files:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/control\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/${LOWERCASE_AREA}_${TEST_NAME}.py\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-weight:normal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYour control file runs the test and sets up default parameters.  The .py file is the test wrapper, and has the actual implementation of the test. You can create multiple control files for the same test that can take different arguments. As an example, \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003epower_SuspendStress\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e test has multiple control files that serve multiple purpose, while sharing the same test logic with different configuration.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eInside the control file, the TEST_CLASS variable should be set to ${LOWERCASE_AREA}.  The naming convention simply exists to make it easier to find other similar tests and measure the coverage in different areas of Chromium OS.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-2.-Create-a-barebone-server-side-test\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 2. Create a barebone server side test\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn this section we will discuss what’s the minimum code needed to create an empty server side test that provides all necessary files and overrides, but with no test logic in it.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-2.1.-Create-a-Control-file\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 2.1. Create a Control file\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eA control file contains important metadata about the test (name, author, description, duration, what suite it’s in, etc) and then pulls in and executes the actual test code. Detailed description about each variable can be found in the \u003c/span\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/docs/best-practices.md\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest Best Practices\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e. You can also find more information about control files \u003c/span\u003e\u003ca href\u003d\"https://github.com/autotest/autotest/wiki/AddingTest\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eIn the folder power_MyBacklightTest you just created, create a control file named “control”, with the following content, set NAME to the test name of “power_MyBacklightTest”. Note that NAME must be exactly the same as the folder name. Set AUTHOR to your name or email address ([user_name]@chromium.org).\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e------------------------------\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e# Copyright information\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003eAUTHOR \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"your name, and at least one person ([ldap]@chromium.org) or a mailing list\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eNAME \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"power_MyBacklightTest\" \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e# test name\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eTIME \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"SHORT\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e             \u003c/span\u003e\u003cfont color\u003d\"#45818e\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# can be MEDIUM, LONG\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eTEST_CATEGORY \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"Benchmark\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e# can be General, Stress\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eTEST_CLASS \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"power\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e# testing area, e.g., platform, network etc\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eTEST_TYPE \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"server\" \u003c/span\u003e\u003cfont color\u003d\"#45818e\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e# indicating it's a server side test \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/p\u003e\u003c/b\u003e\u003c/b\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eSUITE \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"bvt\"                 \u003ci\u003e#\u003c/i\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e\u003ci\u003e if the test should be a part of the BVT\u003c/i\u003e\u003c/font\u003e\u003cfont color\u003d\"#60a0b0\" style\u003d\"font-style:italic\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont color\u003d\"#45818e\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e# EXPERIMENTAL \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\"True\"    # Experiment is now not in use\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\r\nDOC \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003eThis test measures the backlight level before and after certain system events\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003eand verifies that the backlight level has not changed.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003erun_system_power_MyBacklightTest\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(machine):\u003cbr /\u003e    job\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003erun_test(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);vertical-align:baseline;white-space:pre-wrap\"\u003e'power_MyBacklightTest'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e, client_ip\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003emachine)\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e# run the test in multiple machines\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\r\njob\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eparallel_simple(run_system_power_MyBacklightTest, machines)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e-----------------------------------------------------\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eThis control file is used for \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e server to run the test “power_MyBacklightTest” in each test device. The test is defined in the test wrapper file, which is explained in the next section.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eSome important attributes are listed here:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eTIME: time duration to run the test, can be FAST (\u0026lt;1 min), SHORT, MEDIUM, LONG or LENGTHY (\u0026gt;30 min).\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eTEST_CATEGORY: describes the category for your tests e.g. Stress, Functional\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eTEST_TYPE: Client or \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eServer\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e, indicating it’s a client side or server side test.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont color\u003d\"#333333\" face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eSome optional attributes:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eSUITE: A comma-delimited string of suite names that this test should be a part of, e.g. bvt, regression, smoke\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/test-dependencies-in-dynamic-suites\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eDEPENDENCIES\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e: list, of, tags known to the HW test lab, e.g., webcam, blue-tooth\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e(absolete)\u003c/font\u003e\u003cfont color\u003d\"#333333\"\u003e EXPERIMENTAL: if the test is experimental, value can be True or False. For experimental tests, failure is considered to be non-fatal. For the test you uploaded, EXPERIMENTAL should be set to True until the test passes reliably on all intended platforms in the lab.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"color:rgb(51,51,51);margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont color\u003d\"#333333\" face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#333333\" face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-2.2.-Create-a-test-wrapper\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 2.2. Create a test wrapper\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe test wrapper file contains code for the test logic. Following is the source code for a test wrapper for a barebone server side test that contains all the necessary method overrides, but without any test logic. Basically the test wrapper contains a class derived from base class “test” (server/test.py). Autotest server will pick up this class and execute method “run_once” to do the actual test work, and call method cleanup after all tests in this test wrapper is done.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eNote that the name of folder containing the control file, the NAME value in control file, and the test wrapper must match the class name. To create the test wrapper, in the folder power_MyBacklightTest, create test file named “power_MyBacklightTest.py”.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e-----------------------------------------------------\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Copyright information\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e test\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eclass\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003epower_MyBacklightTest\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(test\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003etest):\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#45818e\"\u003e\"\"\"Test to check backlight brightness restored after various actions.\"\"\"\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e    version \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003einitialize\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#333333\"\u003e        \u003c/font\u003e\u003cfont color\u003d\"#45818e\"\u003e\"\"\"Initialize for this particular test.\"\"\"\u003c/font\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cbr /\u003e        \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003epass\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/b\u003e\u003c/div\u003e\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003esetup\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003epass\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003erun_once\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e, client_ip):\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e    \u003cspan\u003e     \u003c/span\u003e\u003c/span\u003e\u003cfont color\u003d\"#45818e\" face\u003d\"verdana, sans-serif\"\u003e\"\"\"Where the actual test logic lives.\"\"\"\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003epass\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003ecleanup\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont color\u003d\"#333333\"\u003e        \u003c/font\u003e\u003cfont color\u003d\"#45818e\"\u003e\"\"\"Called at the end of the test.\"\"\"\u003c/font\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cbr /\u003e        \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003epass\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e-----------------------------------------------------\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe test wrapper’s base class is set to test.test (server/test.py). Autotest server will pick up this class and call following methods in order:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003col style\u003d\"font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003einitialize\u003c/b\u003e, where you can do initialization for this particular test.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003erun_once\u003c/b\u003e, where actual test logic lives.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003ecleanup\u003c/b\u003e, called at the end of the test.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNote that setup is not called during testing. Following are some details about each method and attribute version.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eversion\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;background-color:transparent\"\u003e\u003cspan\u003e    \u003c/span\u003eYou must define the class variable \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;background-color:transparent;color:rgb(51,51,51);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eversion\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small;background-color:transparent;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003einitialize\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cspan\u003e    \u003c/span\u003eThe method\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einitialize\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eruns once for each job. The method is equivalent to \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_init_\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. It is called before actual test is run. However, do not use \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_init_\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for initialization, use \u003cspan\u003e \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einitialize\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e instead. \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_init_\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is defined and used in base class (base_test) to initialize the attributes for the base class. Overriding \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_init_\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e will break the test.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eSetup\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e\u003cspan\u003e    \u003c/span\u003eThis method is the only one called when you\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap;vertical-align:baseline\"\u003ebuild_packages --withautotest\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap;font-style:italic;vertical-align:baseline\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap;vertical-align:baseline\"\u003ewhile other methods are called during testing. The method is triggered when version \u003cspan\u003e    \u003c/span\u003eattribute’s value is changed or the test package is built the first time to produce expected binaries. If the test is scheduled to run in a DUT in which the test has \u003cspan\u003e    \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003ealready been installed, Autotest will check the version attribute’s value of the test class. If the value is changed, the test will be reinstalled. One sample usage of \u003cspan\u003e    \u003c/span\u003ethis method can be found \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq#TOC-Adding-binaries-for-your-tests-to-call-as-part-of-the-test\" style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap;vertical-align:baseline\"\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003erun_once\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cspan\u003e    \u003c/span\u003eYou then must provide an override for the \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erun_once()\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e method in your class. The method contains the actual test logic. The \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erun_once\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e method can accept any \u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003c/span\u003earguments you desire. These are passed in as the\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e*dargs\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ein the \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ejob.run_test()\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emethod in the control file. As the test logic can be complicated, instead of a lengthy \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erun_once\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e()\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e method, it’s highly recommended to use member methods to better organize the test code for easier review.  At the end of this method, you validate the \u003cspan\u003e    \u003c/span\u003etest results in this method, and log any failure.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ci style\u003d\"font-family:arial,sans-serif;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eCleanup\u003c/font\u003e\u003c/i\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan\u003e    \u003c/span\u003ecleanup\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is the method where you do the custodial work, e.g., restore the system’s status to its original state if you have cached that, in this test, it’s the backlight brightness.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-3.-Running-the-server-side-test\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 3. Running the server-side test\u003c/span\u003e\u003c/h3\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Run-Autotest-manually\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eRun Autotest manually\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eAfter the control file and test wrapper file are created, you can try to manually run your \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e against DUT, which has a test image installed (follow \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Build-a-disk-image-for-your-board\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ethis instruction\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e to build a test image using the “test” argument).\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eTo get started, first you need to create or enter a chroot in your host machine. Details can be found \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Create-a-chroot\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e. Go to chromiumos directory, run following command to create or enter a chroot.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003e./chromite/bin/cros_sdk\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eThen go to folder src/scripts, run following command to setup the board, that is, the class of target device.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003e./setup_board --board\u003d${BOARD}\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eGo to folder src/third_party/autotest/files, run following command to start working on the board.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003ecros_workon --board\u003d${BOARD} start .\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eOnce you complete above steps, you can now try to run the server side test. Go to src/scripts directory, run the following command to manually run your Autotest:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003etest_that ${ClientIP} ${LOWERCASE_AREA}_${TEST_NAME}\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e${LOWERCASE_AREA}_${TEST_NAME} is the NAME in control file. If you set NAME attribute to a different value, you need to use that value in test_that command.\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eFor example:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003etest_that 192.168.1.20 power_MyBacklightTest\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eYou need to replace the DUT’s IP address with your own configuration.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eAfter the command is executed, the test should finish in about 30 seconds. You should expect output with detailed information of each step the test is executed, for example:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eInstall autotest if it’s not found in DUT.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eStart autotestd_monitor and collect system information before and after the test.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eExecute the test logic defined in test wrapper.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eAt the end of the output, you will find the test result, like following:\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv\u003e\u003cdiv\u003e------------------------------------------------------------------------------------------------------------\u003c/div\u003e\u003cdiv\u003e/tmp/test_that_results_Bdfrwv/results-1-experimental_power_MyBacklightTest                       [  PASSED  ]\u003c/div\u003e\u003cdiv\u003e/tmp/test_that_results_Bdfrwv/results-1-experimental_power_MyBacklightTest/power_MyBacklightTest [  PASSED  ]\u003c/div\u003e\u003cdiv\u003e------------------------------------------------------------------------------------------------------------\u003c/div\u003e\u003cdiv\u003eTotal PASS: 2/2 (100%)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e18:16:28 INFO | Finished running tests. Results can be found in /tmp/test_that_results_Bdfrwv\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eIn a real world example, the test may take much longer to finish to execute all the test logic.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Add-test-to-an-existing-test-suite\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd test to an existing test suite\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eIf you want Autotest to run your test automatically, you must add it to one or more existing test suites. For example, to have it run as part of the BVT (build validation test), you would edit the \"SUITE\" attribute in the control file, and set it equal to 'bvt'. Autotest then will pick up this test and run it as part of the bvt suite.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe control file and test wrapper must be stored in a subfolder of src/third_party/autotest/files/server/site_tests/ folder. Note that the folder name must match the class name of the test code (the class is the one defined in test wrapper and derived from base class “test”). See the c\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:15px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003eode lab for \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-code-labs/dynamic-suite-codelab\"\u003eCreating and deploying Chromium OS Dynamic Test Suites\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.-Implement-test-logic-in-test-wrapper\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4. Implement test logic in test wrapper\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn the previous section, we show a test wrapper for a barebone server side test that contains all necessary method overrides without any actual code in it. In this section, we will implement the test logic which is to test if the backlight brightness goes back to its original setting after various scenarios. That is, you need to write code to accomplish the following individual tasks:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGet/set backlight’s brightness\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003eLog out and log in user\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSuspend the device and resume\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode will be added to the test wrapper we created in the last section, that is\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003e “power_MyBacklightTest.py”, in the folder power_MyBacklightTest. Follow each steps in this section, and copy the code to the test wrapper “power_MyBacklightTest.py”. At the end you will have a complete test to test the backlight brightness of a DUT.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhile writing a server side test, it is important to keep in mind that the test execution is initiated in the server. To execute a command running on the DUT, you need to run the command through a host object (self._client showing in the code). Different from to a server side test, client side test code is copied to the DUT and executed within the DUT.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.1.-Import-modules-useful-for-Chromium-OS-specific-test\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.1. Import modules useful for Chromium OS specific test\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd the imports at the beginning of test wrapper.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eimport \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003elogging, os, subprocess, tempfile, time\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003efrom \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.client.common_lib\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e import \u003c/span\u003e\u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dblob;f\u003dclient/common_lib/error.py;h\u003dd9854db796a812b86089773b4cfb365a8ddf0359;hb\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eerror\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003efrom \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e import \u003c/span\u003e\u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dblob;f\u003dserver/autotest.py;h\u003d56b578b08da7d61762dad1bec71608db84ed81d4;hb\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003efrom \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e import \u003c/span\u003e\u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dtree;f\u003dserver/hosts;h\u003dc493f142abfaacc5a9db28c64cbc3fbbe9d08f75;hb\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ehosts\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003efrom \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e import \u003c/span\u003e\u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dblob;f\u003dserver/test.py;h\u003d8fdba9d7c40addf23e139b060f558e17bb34e40b;hb\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003etest\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003efrom \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e import \u003c/span\u003e\u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dblob;f\u003dserver/utils.py;h\u003d72f72f938f37b7c7cac729de05df446b0bbbd253;hb\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eutils\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThese modules include some useful base classes to be used to run commands in a test device or control a servo device. More details about how \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq#TOC-Writing-Autotests\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is used in Autotest can be found \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-developer-faq#TOC-A-word-about-imports\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Note that each line only imports one module and modules are ordered alphabetically.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.2. Helper methods\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd following methods to class power_MyBacklightTest. They are some helper methods to execute the commands from the DUT, or used to check the DUT’s power status.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Execute a command on the client.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @param cmd: command to execute on client.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @return: The output object, with stdout and stderr fields.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'Client cmd: [\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e]'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erun(cmd)\u003cbr /\u003e\u003cbr /\u003e\r\n    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd_and_wait_for_restart\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd):\u003cbr /\u003e        boot_id \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eget_boot_id()\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'sh -c \"sync; sleep 1; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\" \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp;'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e cmd)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ewait_for_restart(old_boot_id\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eboot_id)\u003cbr /\u003e\u003cbr /\u003e\r\n    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_check_power_status\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        cmd_result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'status powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'running'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e cmd_result\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003estdout:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'powerd must be running.'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cb style\u003d\"color:rgb(0,0,0);font-style:normal;font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e'power_supply_info | grep online'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e)\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'yes'\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e result\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003estdout:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'power must be plugged in.'\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.3.-Get-Set-brightness\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.3. Get/Set brightness\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd following two methods in class power_MyBacklightTest. In these two methods, a command is passed by _client_cmd method to get current brightness from test device, and _set_brightness to set the device.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Get brightness in integer value. It's not a percentage value and\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        may be over 100\"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'backlight_tool --get_brightness'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eint\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(result\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003estdout\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erstrip())\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, brightness\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e100\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'backlight_tool --set_brightness_percent \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                                           \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e brightness)\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.4.-Actions-being-taken-during-the-test\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.4. Actions being taken during the test\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd following methods in class power_MyBacklightTest. In these methods, command is called to apply actions to DUT, including, logout/login, and power suspend/resume.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;color:rgb(0,112,32);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;color:rgb(6,40,126);vertical-align:baseline;white-space:pre-wrap\"\u003e_do_logout\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;color:rgb(0,112,32);vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13px;font-family:Verdana;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart ui'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_do_suspend\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # The method calls a client side test 'power_resume' to do a power\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # suspend on the DUT. It is easy yet powerful for one test to run\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # another test to implement certain action without duplicating code.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_at\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erun_test(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'power_Resume'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.5.-Disable-ALS-Auto-Light-Sensor-\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.5. Disable ALS(Auto Light Sensor)\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAuto light sensor might interfere the brightness, so it needs to be disabled before test starts, and re-enabled after the test finishes. Add following two methods in class power_MyBacklightTest.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_als_disable\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Turns off ALS in power manager.  Saves the old has_ambient_light_sensor\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e     \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e   flag if it exists.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e       \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Basic use of shell code via ssh run command is acceptable, rather than\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e       # shipping over a small script to perform the same task. \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        als_path \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(64,112,160);font-family:Verdana;font-size:13px;font-style:italic;white-space:pre-wrap\"\u003e'/var/lib/power_manager/has_ambient_light_sensor'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'if [ -e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e ]; then mv \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup; fi'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                         (als_path, als_path, als_path))\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'echo 0 \u0026gt; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e als_path)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_als_disabled \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTrue\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_restore_als_disable\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Restore the has_ambient_light_sensor flag setting that was overwritten in\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           _set_als_disable.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_als_disabled:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        als_path \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'/var/lib/power_manager/has_ambient_light_sensor'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'rm \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e als_path)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'if [ -e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup ]; then mv \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e; fi'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                         (als_path, als_path, als_path))\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.6.-Run-test-and-validate-test-results\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.6. Run test and validate test results\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis is the method where you run the actual test logic. At the end of this method, you validate the test results, and log any failure. It overrides the run_once method in base class test.test.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# The dictionary of test scenarios and its corresponding method to\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    # apply each action to the DUT.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    _transitions \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e {\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                     \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'logout':\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e _do_logout,\u003cbr /\u003e                     \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'suspend'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e: _do_suspend,\u003cbr /\u003e                     }\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erun_once\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, client_ip):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Run the test.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e        For each system transition event in |_transitions|:\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Read the brightness.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Trigger transition event.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Wait for client to come back up.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Check new brightness against previous brightness.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @param client_ip: string of client's ip address (required)\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e client_ip:\u003cbr /\u003e            error\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\"Must provide client's IP address to test\"\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003c/span\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Create a custom host class for this machine, which is used to execute\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# commands and other functions.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e hosts\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecreate_host(client_ip)\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Create an Autotest instance which you can run method like run_test,\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # which can execute another client side test to facilitate this test.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_at \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e autotest\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_client)\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e_results \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e {}\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e_check_power_status()\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/b\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_als_disable()\u003cbr /\u003e\r\n        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Save the original brightness, to be restored after the test ends.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_original_brightness \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness()\u003cbr /\u003e\r\n        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Set the brightness to a random number which is different from\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# system default value.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent(\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e71\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\r\n        \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Run the transition event tests.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e test_name \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_transitions:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness()\u003cbr /\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e_transitions[test_name](\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e)\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/b\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n            \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Save the before and after backlight values.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name] \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e { \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'old'\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_old_brightness,\u003cbr /\u003e                                         \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'new'\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: \u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness() }\u003c/span\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Check results to make sure backlight levels were preserved across\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# transition events.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e0\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003efor\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e test_name \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_results:\u003cbr /\u003e            old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name][\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'old'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e]\u003cbr /\u003e            new_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name][\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'new'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e]\u003cbr /\u003e\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e new_brightness:\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'Transition event [  PASSED  ]: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, test_name)\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eelse\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'Transition event [  FAILED  ]: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, test_name)\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'   Brightness changed: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e -\u0026gt; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003cbr /\u003e                             old_brightness, new_brightness)\u003cbr /\u003e                num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e+\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e0\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTestFail((\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'Failed to preserve backlight over \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e '\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                                  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e'transition event(s).'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e) \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e num_failed)\u003c/span\u003e\u003c/p\u003e\r\n\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-3\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Step-4.7.-Cleanup\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStep 4.7. Cleanup\u003c/span\u003e\u003c/h4\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e“cleanup” is the method where you do the custodial work, e.g., restore the system’s status to its original state if you have cached that, in this test, it’s the backlight brightness. It overrides the cleanup method in base class test.test.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecleanup\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Restore DUT's condition before the test starts, and check the test\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        results.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_restore_als_disable()\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e_original_brightness)\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eFor more information on writing your test, see the \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/testing/autotest-developer-faq\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003efrequently asked questions\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-4\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Verify-Test-by-Running-Autotest-Manually\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVerify Test by Running Autotest Manually\u003c/span\u003e\u003c/h2\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eAfter you complete the last section, you should have all the code ready to run the test. As discussed in earlier section, once you configure the chroot properly, you can try to run the server side test manually with following command in src/scripts folder:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003etest_that ${ClientIP} ${LOWERCASE_AREA}_${TEST_NAME}\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eFor example:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal\"\u003etest_that \u003c/span\u003e192.168.1.20\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,96,0);background-color:rgb(239,239,239);vertical-align:baseline;white-space:pre-wrap\"\u003e power_MyBacklightTest\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eYou need to replace the board name and DUT’s IP address with your own configuration.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline;white-space:pre-wrap\"\u003eIf the test is successful, the following should happen in your test device in order:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eUser log out\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eUser log in\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eScreen brightness stays at 71%.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eScreen goes black (system suspend/resume).\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eSystem comes up again.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eScreen brightness stays at 71%.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;color:rgb(51,51,51);vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;background-color:transparent\"\u003eIn the clean up procedure, screen brightness is reset to its original value.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAll log generated from the test run can be found in a tmp folder, e.g., /tmp/test_that_results_WZ_eVZ.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003e The following are some files useful for troubleshooting an issue:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003estatus and status.log, contains the result of each test’s start/end time and test result.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ekeyval, some setup information, e.g., drone, DUT’s hostname\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edebug/autoserv.DEBUG, contains all logs collected by autoserv during the test.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen the test is completed, following message will be shown at the end of the output to indicate all tests are passed:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e------------------------------------------------------------------------------------------------------------\r\n/tmp/test_that_results_Bdfrwv/results-1-experimental_power_MyBacklightTest [ PASSED ]\r\n/tmp/test_that_results_Bdfrwv/results-1-experimental_power_MyBacklightTest/power_MyBacklightTest [ PASSED ]\r\n------------------------------------------------------------------------------------------------------------\r\nTotal PASS: 2/2 (100%)\r\n\r\n18:16:28 INFO | Finished running tests. Results can be found in /tmp/test_that_results_Bdfrwv\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo review the test result later, you can always run generate_test_report to retrieve above test result.\u003c/span\u003e\u003c/p\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-5\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/h2\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Possible-failure-scenarios\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePossible failure scenarios\u003c/span\u003e\u003c/h2\u003e\r\n\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Device-failed-to-reboot\" /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDevice failed to reboot\u003c/span\u003e\u003c/h3\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf the device failed to reboot during the test, the test will eventually timed out and consider failed. You need to verify the DUT is still connected to network and can be used to test. A quick check you can do is to ssh to the DUT as root user.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003chr style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman\" /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCode of the test wrapper\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eReference: /src/third_party/autotest/files/server/site_tests/power_BacklightServer\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/server/site_tests/power_BacklightServer\"\u003ehttps://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/server/site_tests/power_BacklightServer\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003chr style\u003d\"font-weight:normal;font-size:medium;font-family:Times New Roman\" /\u003e\r\n\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003cbr /\u003e# Use of this source code is governed by a BSD-style license that can be\u003cbr /\u003e# found in the LICENSE file.\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003elogging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eos\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003esubprocess\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003etempfile\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e,\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003etime\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.client.common_lib\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e autotest\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e hosts\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e test\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efrom\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eimport\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e utils\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eclass\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(14,132,181);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003epower_MyBacklightTest\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(test\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003etest):\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Test to check backlight brightness restored after various actions.\"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e    version \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Execute a command on the client.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @param cmd: command to execute on client.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @return: The output object, with stdout and stderr fields.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'Client cmd: [\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e]'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erun(cmd)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd_and_wait_for_restart\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, cmd):\u003cbr /\u003e        boot_id \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eget_boot_id()\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'sh -c \"sync; sleep 1; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\" \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp;'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e cmd)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ewait_for_restart(old_boot_id\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eboot_id)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Get brightness in integer value. It's not a percentage value and\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        may be over 100\"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'backlight_tool --get_brightness'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eint\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(result\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003estdout\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erstrip())\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, brightness\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e100\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'backlight_tool --set_brightness_percent \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                                  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e brightness)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_check_power_status\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        cmd_result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'status powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'running'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e cmd_result\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003estdout:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'powerd must be running.'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e        result \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'power_supply_info | grep online'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'yes'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e result\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003estdout:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'power must be plugged in.'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_do_logout\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart ui'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_do_suspend\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # The method calls a client side test 'power_resume' to do a power\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # suspend on the DUT. It is easy yet powerful for one test to run\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # another test to implement certain action without duplicating code.\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_at\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erun_test(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'power_Resume'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e    _transitions \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e { \u003cbr /\u003e                     'logout': _do_logout,\u003cbr /\u003e                     \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'suspend'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e: _do_suspend,\u003cbr /\u003e                     }\u003cbr /\u003e\u003cbr /\u003e    _als_disabled \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eFalse\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_als_disable\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Turns off ALS in power manager.  Saves the old has_ambient_light_sensor flag if\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           it exists.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        als_path \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(64,112,160);font-family:Verdana;font-size:13px;font-style:italic;white-space:pre-wrap\"\u003e'/var/lib/power_manager/has_ambient_light_sensor'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'if [ -e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e ]; then mv \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup; fi'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                         (als_path, als_path, als_path))\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'echo 0 \u0026gt; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e als_path)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_als_disabled \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTrue\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_restore_als_disable\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Restore the has_ambient_light_sensor flag setting that was overwritten in\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           _set_als_disable.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_als_disabled:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereturn\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        als_path \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'/var/lib/power_manager/has_ambient_light_sensor'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'rm \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e als_path)\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'if [ -e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup ]; then mv \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_backup \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e; fi'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e                         (als_path, als_path, als_path))\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_cmd(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'restart powerd'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erun_once\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, client_ip):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Run the test.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        For each system transition event in |_transitions|:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Read the brightness.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Trigger transition event.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Wait for client to come back up.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e           Check new brightness against previous brightness.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        @param client_ip: string of client's ip address (required)\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e client_ip:\u003cbr /\u003e            error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestError(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"Must provide client's IP address to test\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # Create a custom host class for this machine, which is used to execute\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # commands and other functions.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e hosts\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ecreate_host(client_ip)\u003cbr /\u003e        # Create an Autotest instance which you can run method like run_test,\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        # which can execute another client side test to facilitate this test.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client_at \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e autotest\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAutotest(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_client)\u003cbr /\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_results \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e {}\u003cbr /\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_check_power_status()\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_als_disable()\u003cbr /\u003e\u003cbr /\u003e        # Save the original brightness, to be restored after the test ends.\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_original_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness()\u003cbr /\u003e        # Set the brightness to a random number which is different from\u003cbr /\u003e        # system default value.\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e71\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e        # Run the transition event tests.\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efor\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e test_name \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_transitions:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness()\u003cbr /\u003e\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_transitions[test_name](\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003cbr /\u003e\u003cbr /\u003e            # Save the before and after backlight values.\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name] \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e { \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'old'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_old_brightness,\u003cbr /\u003e                                         \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'new'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_get_brightness() }\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edef\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(6,40,126);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ecleanup\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\"\"\"Restore DUT's condition before the test starts, and check the test\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        results.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"\"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_restore_als_disable()\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_set_brightness_percent(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_original_brightness)\u003cbr /\u003e\u003cbr /\u003e        # Check results to make sure backlight levels were preserved across\u003cbr /\u003e        # transition events.\u003cbr /\u003e        num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e0\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003efor\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e test_name \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ein\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_results:\u003cbr /\u003e            old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name][\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'old'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e]\u003cbr /\u003e            new_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eself\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e_results[test_name][\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'new'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e]\u003cbr /\u003e\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e old_brightness \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003d\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e new_brightness:\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'Transition event [  PASSED  ]: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, test_name)                \u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eelse\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'Transition event [  FAILED  ]: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%s\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e, test_name)\u003cbr /\u003e                logging\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003einfo(\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'   Brightness changed: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e -\u0026gt; \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e,\u003cbr /\u003e                             old_brightness, new_brightness)\u003cbr /\u003e                num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e+\u003d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e1\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003cbr /\u003e        \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eif\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e num_failed \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,160,112);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e0\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003cbr /\u003e            \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(0,112,32);background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eraise\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e error\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTestFail((\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e'Failed to preserve backlight over \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(112,160,208);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e%d\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e '\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb style\u003d\"color:rgb(0,0,0);font-style:normal;font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e                                  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(64,112,160);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e'transition event(s).'\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e) \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e%\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e num_failed)\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb style\u003d\"color:rgb(0,0,0);font-style:normal;font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(96,160,176);background-color:transparent;font-style:italic;vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/b\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/36211457229797764"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-code-labs/server-side-test"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1529733918287523195"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1529733918287523195"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1529733918287523195"}],"author":[{"name":{"$t":"Dan Shi"},"email":{"$t":"dshi@chromium.org"}}],"sites$pageName":{"$t":"server-side-test"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7313547951029714065"},"published":{"$t":"2013-08-30T19:45:09.884Z"},"updated":{"$t":"2018-10-03T20:22:00.792Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-03T20:21:59.436Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Writing Tests FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:350px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Coding-Style\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eCoding Style\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upstream-Documentation\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eUpstream Documentation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-are-useful-libraries-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWhere are useful libraries?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-I-am-writing-RPCs-what-a-is-good-reference-to-look-at-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eI am writing RPCs, what a is good reference to look at? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-Autotests\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eWriting Autotests\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-do-autotests-live-\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eWhere do autotests live?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-word-about-imports\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003eA word about imports\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-a-simple-test-\"\u003e\u003cstrong\u003e5.3 \u003c/strong\u003eWriting a simple test \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adding-binaries-for-your-tests-to-call-as-part-of-the-test\"\u003e\u003cstrong\u003e5.4 \u003c/strong\u003eAdding binaries for your tests to call as part of the test\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Writing-tests-that-require-that-a-user-is-logged-in\"\u003e\u003cstrong\u003e5.5 \u003c/strong\u003eWriting tests that require that a user is logged in\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-do-printf-style-debugging-in-tests-\"\u003e\u003cstrong\u003e5.6 \u003c/strong\u003eHow do I do printf-style debugging in tests?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-performance-test-\"\u003e\u003cstrong\u003e5.7 \u003c/strong\u003eHow do I write a performance test?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-hardware-qualification-test-\"\u003e\u003cstrong\u003e5.8 \u003c/strong\u003eHow do I write a hardware qualification test?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-manufacturing-test-\"\u003e\u003cstrong\u003e5.9 \u003c/strong\u003eHow do I write a manufacturing test? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-interacts-with-the-UI-\"\u003e\u003cstrong\u003e5.10 \u003c/strong\u003eHow do I write a test that interacts with the UI?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-uses-Telemetry-\"\u003e\u003cstrong\u003e5.11 \u003c/strong\u003eHow do I write a test that uses Telemetry?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-bundle-a-bunch-of-tests-into-a-suite-that-can-be-scheduled-and-run-as-a-group-\"\u003e\u003cstrong\u003e5.12 \u003c/strong\u003eHow do I bundle a bunch of tests into a suite that can be scheduled and run as a group?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-requires-some-human-interaction-\"\u003e\u003cstrong\u003e5.13 \u003c/strong\u003eHow do I write a test that requires some human interaction? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-create-a-test-that-requires-running-existing-Linux-utilities-that-are-not-currently-installed-\"\u003e\u003cstrong\u003e5.14 \u003c/strong\u003eHow do I create a test that requires running existing Linux utilities that are not currently installed? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-create-a-test-that-requires-compiling-code-\"\u003e\u003cstrong\u003e5.15 \u003c/strong\u003eHow do I create a test that requires compiling code? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-do-I-get-the-error-make:-command-not-found-or-patch:-command-not-found-\"\u003e\u003cstrong\u003e5.16 \u003c/strong\u003eWhy do I get the error \"make: command not found\" or \"patch: command not found\"?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-if-I-want-to-make-use-of-a-binary-tool-\"\u003e\u003cstrong\u003e5.17 \u003c/strong\u003eWhat if I want to make use of a binary tool?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-needs-access-to-large-data-files-like-media-files-\"\u003e\u003cstrong\u003e5.18 \u003c/strong\u003eHow do I write a test that needs access to large data files, like media files? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-reboots-the-device-\"\u003e\u003cstrong\u003e5.19 \u003c/strong\u003eHow do I write a test that reboots the device? \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-write-a-test-that-measures-power-consumption-\"\u003e\u003cstrong\u003e5.20 \u003c/strong\u003eHow do I write a test that measures power consumption?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-language-can-I-write-my-test-in-\"\u003e\u003cstrong\u003e5.21 \u003c/strong\u003eWhat language can I write my test in?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Coding-Style\" /\u003eCoding Style\u003c/h2\u003e\u003cdiv\u003eAs Autotest is a mature upstream project we follow their style code when it comes to committing changes here as opposed to the Chromium OS style guide. Please refer to the coding style document that is in autotest/CODING_STYLE or view it \u003ca href\u003d\"https://gerrit.chromium.org/gerrit/gitweb?p\u003dchromiumos/third_party/autotest.git;a\u003dblob;f\u003dCODING_STYLE;\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Upstream-Documentation\" /\u003eUpstream Documentation\u003c/h2\u003e\u003cdiv\u003eUpstream is hosted on github at \u003ca href\u003d\"http://autotest.github.com/\" rel\u003d\"nofollow\"\u003ehttp://autotest.github.com\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eUpstream Wiki \u003ca href\u003d\"https://github.com/autotest/autotest/wiki\" rel\u003d\"nofollow\"\u003ehttps://github.com/autotest/autotest/wiki\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe github website doesn't really let you search through the docs but, you can clone the wiki repo and grep through it:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003egit clone https://github.com/autotest/autotest.wiki.git\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Where-are-useful-libraries-\" /\u003eWhere are useful libraries?\u003c/h2\u003e\u003cdiv\u003eAutotest has an import structure that exposes a lot of functionality from a number of different places. Good places to grep for code that may already do what you need is:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn general we should try to use the same functions in tests that are written rather than creating similar functions. This helps keep the whole frame work in a maintainable state and utilizes code that has been used for a while and is known to work. \u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eclient/common_lib\u003c/li\u003e\u003cli\u003eclient/bin\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-I-am-writing-RPCs-what-a-is-good-reference-to-look-at-\" /\u003eI am writing RPCs, what a is good reference to look at? \u003c/h2\u003e\u003cdiv\u003eLooking at the RPC doc from the server itself can be useful.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://cautotest/afe/server/rpc_doc\" rel\u003d\"nofollow\"\u003ehttp://cautotest/afe/server/rpc_doc\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Writing-Autotests\" /\u003eWriting Autotests\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Where-do-autotests-live-\" /\u003eWhere do autotests live?\u003c/h3\u003eMost tests are checked in under third_party/autotest/files/ (autotest.git chromium-os project). Some may be scattered around other locations. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/building-and-running-tests#TOC-Q1:-What-autotest-ebuilds-are-out-there-\"\u003elink\u003c/a\u003e to find out the complete list.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eTest cases are not upstreamed to the general autotest repository as most are Chromium OS specific.  They are checked out as part of the regular sync command you used from the Chromium OS repository.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003edfdf\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-A-word-about-imports\" /\u003e\u003cfont size\u003d\"3\"\u003eA word about imports\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eAutotest has an interesting way of imports due to it not being installed properly in PYTHONPATH. This is not an issue on Autotest trunk but Chromium OS has not yet remerged all the work there. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen dealing with Autotest internal modules you will need to import/create a \u003ci\u003ecommon.py\u003c/i\u003e file that can relatively reference the root directory of Autotest. You will find these spread throughout the code base and below is a concrete example.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you are working on code under \u003cb\u003eautotest/files/client/common_lib\u003c/b\u003e and you wanted to imported something from server you would need to\u003ci\u003e import a common.py\u003c/i\u003e that looks similar to the following:\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport os, sys\r\ndirname \u003d os.path.dirname(sys.modules[__name__].__file__)\r\nclient_dir \u003d os.path.abspath(os.path.join(dirname, \"..\"))\r\nsys.path.insert(0, client_dir)\r\nimport setup_modules\r\nsys.path.pop(0)\r\nsetup_modules.setup(base_path\u003dclient_dir,\r\n root_module_name\u003d\"autotest_lib.client\")\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e*Notice the relative path that is fed in to the client_dir variable. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce this is in the directory where you want to use the Autotest \u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport os, sys\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003eimport common\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003efrom autotest_lib.server import frontend\u003c/code\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003ccode\u003efrontend.. etc etc\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cbr /\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cb\u003e**Note when you are writing a test the framework automatically makes autotest_lib available for you. There is no need to place a copy of common.py in your test directory.\u003c/b\u003e\u003c/pre\u003e\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e\u003cb\u003e \u003c/b\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Writing-a-simple-test-\" /\u003e\u003cfont size\u003d\"3\"\u003eWriting a simple test \u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv\u003eAutotest tests are checked into several locations under third_party/autotest.  \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere are two flavors of tests: client and server.  All tests are managed by an autotest server machine that is typically the machine where run_remote_tests is invoked.  Client tests execute entirely on the Chromium OS device.  Server tests execute on both server and client or only the server.  Client tests are usually the simplest to write and run.  Server tests are needed, for example, if a test needs to reboot the device or interact with external devices (e.g. to cut off power to the Chromium OS device).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTests are located in 4 locations in the \u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ethird_party/autotest/files/ \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003etree:\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eclient/site_tests - These are where most tests live.  These are client tests that are Chromium OS specific.\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eclient/tests - These are client tests that are general Linux tests (not Chromium OS specific).\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eserver/site_tests - These are server tests that are Chromium OS specific.\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:20px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eserver/tests - These are server tests that are general Linux tests (not Chromium OS specific).\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cfont size\u003d\"6\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eDecide if your test is a client or server test and choose the appropriate directory from the above.  In the sections below we refer to this directory as ${TEST_ROOT} below.\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003eNext decide which area your test falls within based on the tracker (\u003ca href\u003d\"http://code.google.com/p/chromium-os/issues/list\"\u003ehttp://code.google.com/p/chromium-os/issues/list\u003c/a\u003e).  It should be something like \"desktopui\", \"platform\", or \"network\" for instance.  This name is used to create the test name; e.g. \"network_UnplugCable\".  Create a directory for your test at $(TEST_ROOT)/$(LOWERCASE_AREA)_$(TEST_NAME).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTry to find an example test that does something similar and copy it.  You will create at least 2 files:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/control\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e${TEST_ROOT}/${LOWERCASE_AREA}_${TEST_NAME}/${LOWERCASE_AREA}_${TEST_NAME}.py\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eYour control file runs the test and sets up default parameters.  The .py file is the actual implementation of the test.  \u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e \u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eInside the control the TEST_CLASS variable should be set to ${LOWERCASE_AREA}.  The naming convention simply exists to make it easier to find other similar tests and measure the coverage in different areas of Chromium OS.  \u003c/div\u003e \u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eYou may also want to add this test to one or more existing test suites to have it run automatically.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-size:20px\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eAfter this, you should modify the autotest-tests-9999.ebuild under src/third_party/chromiumos-overlay/chromeos-base/autotest-tests and add your test to IUSE_TESTS or it won't be picked up by autotest when you ask it to build specific tests.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-binaries-for-your-tests-to-call-as-part-of-the-test\" /\u003e\u003cfont size\u003d\"3\"\u003eAdding binaries for your tests to call as part of the test\u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003eIn order to cross-compile, your test's compilation step should be implemented inside the \u003ccode\u003esetup()\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#000000\"\u003e method of your python code.\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e A couple of simple examples:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSources inside the autotest repo as part of the test: gl_Bench\u003c/li\u003e\u003cli\u003eSources checked in as a tarball from upstream: hardware_SAT\u003c/li\u003e\u003cli\u003eSources checked in other Chromium OS source repo: firmware_VbootCrypto, desktopui_DoLogin\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003eThe setup method of all python scripts are built as part of build_autotest.sh (which is called when you build_packages --withautotest).  This script calls all the setup functions of every python test and runs them.  These setup steps are compiled on the host for execution on the target.  The cross-compiler flags are already set so make sure if you have your own Makefile to take in the CC, CFLAGS, etc from the environment rather than hardcode them.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eNote that if you have a \u003c/i\u003e\u003ccode\u003e\u003ci\u003esetup() \u003c/i\u003e\u003c/code\u003e\u003ci\u003emethod, it should create a \u003c/i\u003e\u003ccode\u003e\u003ci\u003esrc\u003c/i\u003e\u003c/code\u003e\u003ci\u003e directory, even if empty, to avoid running the setup method on the target device.\u003c/i\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Writing-tests-that-require-that-a-user-is-logged-in\" /\u003e\u003cfont size\u003d\"3\"\u003eWriting tests that require that a user is logged in\u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003eIf you write a test that requires a user is logged in, have your test subclass site_ui_test.UITest.  Any test that is a subclass of this class will login with the default test account as part\u003c/div\u003e\u003cdiv\u003eof test initialization and logout as part of test cleanup.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-do-printf-style-debugging-in-tests-\" /\u003eHow do I do printf-style debugging in tests?\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eUse logging.info() to generate log messages.  If you are writing a client-side test, the output unfortunately will not be shown while you are running autoserv (either directly or indirectly by using run_remote_test.sh).  If you want to print out numeric data that would be generally useful for developers to track over time, consider instead making this a performance test.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-performance-test-\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003eHow do I write a performance test?\u003c/div\u003e\u003c/h3\u003e\u003cdiv\u003eA performance test is like any other test except it also logs one or more \u003ci\u003eperformance keyvals\u003c/i\u003e.  A performance keyval is just an identifier and a floating point number that is written to a keyvals file on the machine where run_remote_tests is invoked.  The identifier should be of the form ${UNITS}_${DESCRIPTION}.  For a simple example, refer to hardware_DiskSize and how it uses self.write_perf_keyval().\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-hardware-qualification-test-\" /\u003eHow do I write a hardware qualification test?\u003c/h3\u003e\u003cdiv\u003eHardware qualification tests are like all other tests.  The only difference is that they are referenced in one of the HWQual/config.* files.  If they require no manual setup or steps, they should be added to HWQual/config.auto.  Otherwise, a new config file should be created and instructions on the manual steps should be added to suite_HWQual/README.txt.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHardware qualification tests also usually involve a benchmark and a minimum requirement for that benchmark.  The nicest way to do this is to make your test record performance metrics with write_perf_keyval() and then add a constraints list in the HWQual control file that sets the minimum values.  See suite_HWQual/control.auto constraints parameters for examples.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-manufacturing-test-\" /\u003eHow do I write a manufacturing test?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003eSee how to write a hardware qualification test.  A manufacturing test should be written similarly, however there is not currently (3/3/2010) a suite for manufacturing tests.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-interacts-with-the-UI-\" /\u003eHow do I write a test that interacts with the UI?\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eThis varies widely depending on which UI you would like to interact with.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you would like to temporarily shut down X:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003efrom autotest_lib.client.cros import cros_ui\u003cbr /\u003ecros_ui.stop()\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou can then start it back up by doing:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003efrom autotest_lib.client.cros import cros_ui\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003ecros_ui.start()\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you want to control chrome, use PyAuto. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:238a01b0dd98e228\" class\u003d\"disabled\"\u003ePyAuto on ChromiumOS\u003c/a\u003e page for more details. desktopui_UrlFetch is a sample autotest test that uses pyauto to control chrome.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote: \u003c/b\u003ePyauto is getting deprecated and being replace with Telemetry. Please see below for how to run a Telemetry Test/Benchmark in autotest.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-uses-Telemetry-\" /\u003eHow do I write a test that uses Telemetry?\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:2ac9d0831610f563#TOC-Wrapping-a-Telemetry-test-in-Autotest\" class\u003d\"disabled\"\u003ePlease refer to Wrapping a Telemetry test in Autotest\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-bundle-a-bunch-of-tests-into-a-suite-that-can-be-scheduled-and-run-as-a-group-\" /\u003eHow do I bundle a bunch of tests into a suite that can be scheduled and run as a group?\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eSee \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/dynamic-suites/dynamic-test-suites\"\u003ehttps://sites.google.com/a/chromium.org/dev/chromium-os/testing2/dynamic-suites/dynamic-test-suites\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-requires-some-human-interaction-\" /\u003eHow do I write a test that requires some human interaction?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003eWe call these semi-automated tests.  If you want to write a test that pops up a Chrome window, ask the test engineer some questions or to interact with some web browser functionality, and verify the result, refer to the desktopui_ChromeSemiAuto test.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-create-a-test-that-requires-running-existing-Linux-utilities-that-are-not-currently-installed-\" /\u003eHow do I create a test that requires running existing Linux utilities that are not currently installed?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eRefer to the steps for a \"no cross-compilation\" test first.  For this additional component, you could add it to the image, but this is highly discouraged, especially if only your test is likely to use the tool.  Instead, it's better to create a deps directory for the tool which builds it and installs it.  A simple example is hardware_SsdDetection which installs the hdparm utility.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-create-a-test-that-requires-compiling-code-\" /\u003eHow do I create a test that requires compiling code?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003eIn order to cross-compile, your test's compilation step should be implemented inside the \u003ccode\u003esetup()\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#000000\"\u003e method of your python code.\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e A couple of simple examples:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSources inside the autotest repo as part of the test: gl_Bench\u003c/li\u003e\u003cli\u003eSources checked in as a tarball from upstream: system_SAT\u003c/li\u003e\u003cli\u003eSources checked in other Chromium OS source repo: firmware_VbootCrypto, system_AutoLogin\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003eIt is your responsibility to make sure the test will build for all supported platforms as it will cause a build break if it does not.\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that if you have a \u003ccode\u003esetup() \u003c/code\u003emethod, it should create a \u003ccode\u003esrc\u003c/code\u003e directory, even if empty, to avoid running the setup method on the target device.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHere's an example.  This is the content of platform_NullTest.py:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:12px;line-height:12px\" /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e#!/usr/bin/python\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# Copyright 2018 The Chromium Authors. All rights reserved.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e# found in the LICENSE file.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003eimport os\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003efrom autotest_lib.client.bin import test, utils\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003eclass platform_NullTest(test.test):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    \"\"\"\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    Test autotest.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    \"\"\"\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    version \u003d 1\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    executable \u003d 'nulltest'\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    def setup(self):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        os.chdir(self.srcdir)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        utils.make(self.executable)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e    def run_once(self):\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e        utils.system(self.srcdir + \"/\" + self.executable + \" autotesting\",\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"line-height:12px\"\u003e\u003ccode\u003e\u003cfont size\u003d\"3\"\u003e                     timeout\u003d60)\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAfter creating this file (and \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003econtrol\u003c/span\u003e, \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003esrc/Makefile\u003c/span\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e, \u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eand\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e src/nulltest.c\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e), add a line to the autotest-tests ebuild (\u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003echromiumos-overlay/chromeos-base/autotest-tests/autotest-tests-9999.ebuild\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e).  Make sure that autotest-tests is in your cros_workon list, then run \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003eTESTS\u003dplatform_NullTest emerge-\u0026lt;board\u0026gt; autotest-tests\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  This should compile your C program.  After this, you may run\u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"'courier new', monospace\"\u003erun_remote_tests --use_emerged\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  Don't use gmerge for autotest or autotest-tests.\u003c/font\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Why-do-I-get-the-error-make:-command-not-found-or-patch:-command-not-found-\" /\u003eWhy do I get the error \"make: command not found\" or \"patch: command not found\"?\u003c/h3\u003e\u003cdiv\u003eThese messages come up when autotest tries to run 'make' or 'patch' on the client.  They are not supposed to run there.  Test code is only patched and compiled on the host.\u003c/div\u003e\u003cdiv\u003eCommon mistakes are:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003efailed to first build with 'TESTS\u003dnewtest emerge-\u0026lt;board\u0026gt; autotest-tests'.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003efailed to run the run_remote_tests.sh script with --use_emerged.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-What-if-I-want-to-make-use-of-a-binary-tool-\" /\u003eWhat if I want to make use of a binary tool?\u003c/h3\u003eSee the instructions for including and building the source above, or use the ebuild method if needed. You cannot simply include a pre-built binary (e.g. by checking it into the repository) since this will not work on any platform. All software must be built by the official toolchain for that platform and the only reasonable way to be sure of that is to include the source and build it.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-needs-access-to-large-data-files-like-media-files-\" /\u003eHow do I write a test that needs access to large data files, like media files?\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e \u003c/span\u003e\u003c/h3\u003eIf the data files are posted somewhere else, they may fetched by the test when it starts.  If you add the fetching to the setup() method, this will cause the fetch to occur during build_autotest and cause the fetched results to be put in every packaged build of autotest.  This can cause a large package and might also imply that the media/data may be repackaged.  The same issues apply if you commit the large data files.  Instead it's preferable to fetch the data from the client machine.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBeware of licensing restrictions on sample data used by a test.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-reboots-the-device-\" /\u003eHow do I write a test that reboots the device? \u003c/h3\u003eSee server/site_tests/platform_BootPerfServer, which reboots the device and runs the client test platform_BootPerf which logs performance data about boot time.  Note that your test must be a server test.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-write-a-test-that-measures-power-consumption-\" /\u003eHow do I write a test that measures power consumption?\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eSee power_IdleServer.  This test cuts power and logs performance data in the form of battery life remaining information.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-What-language-can-I-write-my-test-in-\" /\u003eWhat language can I write my test in?\u003c/h3\u003e\u003cdiv\u003eThe most straightforward language to use is Python.  Every autotest needs at least some Python code in the control file, and recording performance results, printf-style debugging, and passing up informative error messages all require Python code.  You can also write C/C++ cross-compiled code.  You can even write shell scripts, but do note that you will cause yourself extra pain either when developing your test and/or when diagnosing problems if you choose a language other than Python.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7499499827193616996"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/writing-and-developing-tests/writing-tests-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7313547951029714065"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7313547951029714065"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7313547951029714065"}],"author":[{}],"sites$pageName":{"$t":"writing-tests-faq"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7337698896469929736"},"published":{"$t":"2013-08-30T19:45:39.089Z"},"updated":{"$t":"2018-10-03T20:19:15.435Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-03T20:19:13.235Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Test Deps FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:350px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Where-do-I-store-large-files-that-need-to-be-publicly-accessible-for-tests-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eWhere do I store large files that need to be publicly accessible for tests?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-use-deps-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eHow do I use deps?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-can-I-create-my-own-dep-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eHow can I create my own dep?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Troubleshooting-your-dep\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eTroubleshooting your dep\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-if-my-dep-is-built-by-another-ebuild-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eWhat if my dep is built by another ebuild?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Where-do-I-store-large-files-that-need-to-be-publicly-accessible-for-tests-\" /\u003eWhere do I store large files that need to be publicly accessible for tests?\u003c/h3\u003e\r\n\u003cdiv\u003eGoogle Storage is used as the general storage facility for large files. Please avoid putting large files in git as it increases everyone's check out size. A good general rule of thumb is: \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf it is a file larger than 5 megs that will be changing over time, put it in Google Storage.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eA similar approach is taken as \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/localmirror\" rel\u003d\"nofollow\"\u003elocalmirror\u003c/a\u003e except we use the Google Storage bucket \u003cb\u003e\u003ci\u003egs://chromeos-test-public\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\r\n\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003eTo upload your files please follow \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/localmirror#TOC-How-do-I-get-my-files-in-localmirro\" rel\u003d\"nofollow\"\u003e\"How to get your files my files to local mirror\"\u003c/a\u003e but using the bucket \u003cb\u003e\u003ci\u003egs://chromeos-test-public\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\r\n\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://sandbox.google.com/storage/?arg\u003dchromeos-test-public\"\u003ehttp://sandbox.google.com/storage/?arg\u003dchromeos-test-public\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-use-deps-\" /\u003eHow do I use deps?\u003c/h3\u003e\r\nThe deps feature is used to install packages that are required by tests. Sometimes these packages must be compiled from source and installed on the test machine. Rather than include this installation procedure in the test itself, we can create a 'dep' which does this for us. Then the test can specify that it needs this dep to work. Autotest will make sure that the dependency is built and copied to the target.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFirst take a look at an example: hardware_SsdDetection. You will notice that it does this in the setup method:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eself.job.setup_dep(['hdparm'])\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis ends up running the python file \u003ccode\u003eclient/deps/hdparm.py\u003c/code\u003e. This will look after building the hdparm utility and making sure it is available for copying to the target. The mechanics of this are explained in the next topic, but imagine using \u003ccode\u003e./configure\u003c/code\u003e and installing with the \u003ccode\u003eclient/deps/hdparm\u003c/code\u003e directory as the install root.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWithin the run_once() method in the test you will see this:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e        dep \u003d 'hdparm'\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        dep_dir \u003d os.path.join(self.autodir, 'deps', dep)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        self.job.install_pkg(dep, 'dep', dep_dir)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis is the code which actually installs the hdparm utility on the target. It will be made available in the \u003ccode\u003e/usr/local/autotest/deps/hdparm\u003c/code\u003e directory in this case. When it comes time to run it, you will see this code:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e        path \u003d self.autodir + '/deps/hdparm/sbin/'\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        hdparm \u003d utils.run(path + 'hdparm -I %s' % device)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThis is pretty simple - since the hdparm binary was installed to \u003ccode\u003eclient/deps/hdparm/sbin/hdparm\u003c/code\u003e we can run it there on the target.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-can-I-create-my-own-dep-\" /\u003eHow can I create my own dep?\u003c/h3\u003e\r\nIf you have your own tool and want to create a dep for it so that various tests can use it, this section is for you.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFirst create a subdirectory within deps. Let's call your dep 'harry'. So you will create \u003ccode\u003eclient/deps/harry\u003c/code\u003e and put \u003ccode\u003eharry.py\u003c/code\u003e inside there.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIn harry.py you will want something like the following:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport os\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003efrom autotest_lib.client.bin import utils\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eversion \u003d 1\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003edef setup(tarball, topdir):\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    srcdir \u003d os.path.join(topdir, 'src')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.extract_tarball_to_dir(tarball, srcdir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    os.chdir(srcdir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.system('patch -p1 \u0026lt; ../fix-wibble.patch')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.configure()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    utils.make()\u003cbr /\u003e\r\n\u003c/code\u003e\u003ccode\u003e    utils.make('install')\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e# We got the src from http://harry.net/harry-0.24.tar.bz2\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003epwd \u003d os.getcwd()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003etarball \u003d os.path.join(pwd, 'harry-0.24.tar.bz2')\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eutils.update_version(pwd + '/src', False, version, setup, tarball, pwd)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nThe URL mentioned in the file should be the location where you found your tarball. Download this and put it in the deps directory as well. You will be checking this into the repository as a binary file.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe \u003ccode\u003eutils.update_version()\u003c/code\u003e call ensures that the correct version of harry is installed. It will call your setup() method to build and install it. If you specify False for the preserve_srcdir parameter then it will always erase the src directory, and call your setup() method. But if you specify True for preserve_srcdir, then update_version() will check the installed version of the src directory, and if it hasn't changed it will not bother installing it again.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nYou will also see that pwd is set to the current directory. This is \u003ccode\u003eclient/deps/harry\u003c/code\u003e in this case because autotest changes this directory before importing your python module. We unpack into a src subdirectory within that to keep things clean.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhen your setup() method is called it should unpack the tarball, configure and build the source, then install the resulting binaries under the same \u003ccode\u003eclient/deps/harry\u003c/code\u003e directory. You can see the steps in the example above - it mirrors a standard GNU UNIX build process. If you need to pass parameters to configure or make you can do that also. Any parameters after 'setup' in the update_version() call are passed to your setup method. \u003cbr /\u003e\r\n\u003cbr /\u003e\r\nAfter calling utils.update_version() from within harry.py we will have binaries installed (say in \u003ccode\u003eclient/deps/harry/sbin/harry\u003c/code\u003e) as well as the src directory still there (\u003ccode\u003eclient/deps/harry/src\u003c/code\u003e).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFinally for reasons that we won't go into you should create the file common.py in your directory, like this:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport os, sys\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003edirname \u003d os.path.dirname(sys.modules[__name__].__file__)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eclient_dir \u003d os.path.abspath(os.path.join(dirname, \"../../\"))\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esys.path.insert(0, client_dir)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eimport setup_modules\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esys.path.pop(0)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esetup_modules.setup(base_path\u003dclient_dir,\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e                    root_module_name\u003d\"autotest_lib.client\")\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eand you need a file called 'control' too:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003ejob.setup_dep(['fio'])\u003c/code\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Troubleshooting-your-dep\" /\u003eTroubleshooting your dep\u003c/h3\u003e\r\nIf you have created a new dep but run_remote_tests.sh doesn't work and you get an error like:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ePackageInstallError: Installation of harry(type:dep) failed : dep-harry.tar.bz2 could not be fetched from any of the repos ['autoserv://']\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nthen this section is for you. It explains a little more of the detail of how the dependencies are transfered from server (your workstation) to the client (target).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhen you call  self.job.install_pkg(dep, 'dep', self.dep_dir), it causes the autotest client to install the dependency. In this case the client will end up using the autoserv fetcher. Within client/bin/harness_autoserve.py you will see the class AutoservFetcher. It has a method fetch_pkg_file() which calls harness_autoserv.fetch_package() to fetch the package. This issues a AUTOTEST_FETCH_PACKAGE command over the logging connection to autoserv, requesting the package. Yes the logging connection is re-used to support a kind of ftp server for the client!\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe server end of autoserv sits in server/autotest.py. Each line of log output coming from the client is examined in client_logger._process_line(). When it sees a line starting with AUTOTEST_FETCH_PACKAGE it calls _send_tarball() which tries to find a matching directory to package up and send. The pkg_name is in a standard format: \u003ccode\u003epkgtype-name.tar.bz2\u003c/code\u003e and in this case pkgtype is 'dep'. It will package up the client/deps/\u0026lt;name\u0026gt; directory into a tarball and send it to the client. When this is working you will see something like this message when you run the test:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e12:08:06 INFO | Bundling /home/sjg/trunk/src/third_party/autotest/files/client/deps/harry into dep-harry.tar.bz2\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nWhen it is not working, make sure the directory exists on the server side in the right place.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-if-my-dep-is-built-by-another-ebuild-\" /\u003eWhat if my dep is built by another ebuild?\u003c/h3\u003e\r\nThe above method is fine for external packages, but it is not uncommon to want to use a byproduct of another ebuild within a test. A good example of this is the Chromium functional tests, which require PyAuto, a test automation framework built by Chromium. In the \u003ccode\u003esrc/third_party/chromiumos-overlay/chromeos-base/\u003c/code\u003e\u003ccode\u003echromeos-chrome\u003c/code\u003e ebuild you will see:\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e    if use build_tests; then\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        install_chrome_test_resources \"${WORKDIR}/test_src\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # NOTE: Since chrome is built inside distfiles, we have to get\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # rid of the previous instance first.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        rm -rf \"${WORKDIR}/${P}/${AUTOTEST_DEPS}/chrome_test/test_src\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        mv \"${WORKDIR}/test_src\" \"${WORKDIR}/${P}/${AUTOTEST_DEPS}/chrome_test/\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e        # HACK: It would make more sense to call autotest_src_prepare in\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        # src_prepare, but we need to call install_chrome_test_resources first.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e        autotest_src_prepare\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nYou can see that this is creating a deps directory within the build root of chrome, called chrome_test. From the previous section we know that a chrome_test.py file must be installed in this deps directory for this to work. This actually comes from the chromium tree (\u003ccode\u003echrome/src/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py\u003c/code\u003e since you asked). This file is very simple:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e#!/usr/bin/python\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# Use of this source code is governed by a BSD-style license that can be\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e# found in the LICENSE file.\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eimport common, commands, logging, os\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003efrom autotest_lib.client.bin import utils\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003eversion \u003d 1\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003edef setup(top_dir):\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    return\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003epwd \u003d os.getcwd()\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eutils.update_version(pwd + '/src', False, version, setup, None)\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nIn this case the directory already contains pre-built binaries, since they were built and copied in by the ebuild above. The setup() method will always be called, but has nothing to do.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7499499827193616996"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/writing-and-developing-tests/test-deps-faq"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7337698896469929736"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7337698896469929736"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7337698896469929736"}],"author":[{}],"sites$pageName":{"$t":"test-deps-faq"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5400267747743172725"},"published":{"$t":"2012-11-09T20:36:00.286Z"},"updated":{"$t":"2018-10-01T11:35:56.852Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-09T22:37:25.812Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Powerwash"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eStatus\u003c/b\u003e: v1 implemented in M23\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eGoal\u003c/b\u003e\u003c/font\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eProvide users with a means to clear mutable system data as part of the base OS.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cb\u003eBackground\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere are a number of cases where it can be useful for users to have a safety hatch that doesn't require knowledge of the developer switch or have a valid recovery device (USB Stick, or SD card) handy:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eDisk corruption: in the wrong place, it could impair the ability to sign in to any account\u003c/li\u003e\u003cli\u003eBad update interaction: may impair sign-in or other behavior\u003c/li\u003e\u003cli\u003eToo many accounts to delete one at a time: happens in lab environments or other high traffic locations\u003c/li\u003e\u003cli\u003e...\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eRequirements\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003ev1:\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cul\u003e\u003cli\u003eMust be accessible from the normal UI\u003c/li\u003e\u003cli\u003eMust be accessible before sign-in\u003c/li\u003e\u003cli\u003eMust not be usable by a remote attacker with a single account compromise\u003c/li\u003e\u003cli\u003eMust not destroy unrecoverable data: Limited TPM state on disk, Install-time Attributes file\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003ev2:\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cul\u003e\u003cli\u003eMust clear the TPM, or\u003c/li\u003e\u003cli\u003eMust preserve enterprise enrollment status\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eMay preserve enterprise enrollment token\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eOverview\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePowerwash will provide a key combination that is accessible at the sign-in screen (Ctrl+Alt+Shift+R) and a menu item in Settings, after sign-in, to trigger a system wipe.  The wipe itself will using an existing implementation and will be performed at boot-time. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eDetailed Design\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePowerwash is simple in practice. It performs the following steps at boot-time: \u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePreserve any files desired by moving them to /tmp (a ramdisk)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePerform a fast wipe of the stateful partition (using the same script as the developer mode transition back to verified)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eRestore the files preserved in /tmp \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIn order to trigger those steps, a request from Chrome must be made to the session manager requesting a wipe.  If no user has signed in to the system yet, then the request will be granted, and a wipe will occur on the next boot.  If a user has signed in, then a request to wipe the system will result in a reboot followed by a confirmation request at the sign-in screen.  This is meant to limit the risk of a single compromised account from being used to wipe a machine.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eInterface to Chrome\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChrome will communicate with session_manager over DBus.  A call to StartDeviceWipe() will trigger the request.  If no user has signed in, then session_manager writes \"fast safe\" to a reset file: /mnt/stateful_partition/factory_install_reset.  This is already used for factory wipes, so the changes are minimal.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eWipe mechanism\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eDuring boot, chromeos_startup checks the ownership (root) and existence of the reset file.  This will follow the normal factory reset wipe path except that it will not use the factory wipe screen. clobber-state is then called with the arguments in the reset file, as mentioned above.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003ePreserved Files\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn order to preserve files, the \"safe\" argument is added to clobber-state. A \"safe\" wipe will use the tar utility to preserve the path, ownership, and permissions of any files that should survive the wipe.  At present, the install attributes file (lockbox.pb) and the TPM key blobs are preserved.  The TPM is not cleared by a power wash which means that the lockbox cannot be reinitialized nor can some pre-TPM-ownership actions be taken.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eInternationalization\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe UI in Chrome will use the normal localized asset infrastructure.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe wipe message will use chromeos-boot-alert's localized asset implementation.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eSecurity considerations\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe primary security considerations here are around whether a remote attacker can wipe a system.  While this is not necessarily the most malicious of attacks, it would not be a pleasant user experience in the least.  To limit this attack, we've required that powerwash be triggered or confirmed prior to any active accounts signing in.  This means that an unprivileged attacker could request a powerwash, but not persist across the reboot to confirm it (minus a small chronos-owner attack surface at sign-in time).  If an attacker had gained higher privileges, then they could wipe the device without help.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003ePrivacy considerations\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eThis feature allows users to wipe all user data and no user data is generated in the process.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eTesting Plans\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e(detailed elsewhere)\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eCaveats\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eDifferences from a developer mode wipe:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eThe TPM is not cleared which means:\u003c/li\u003e\u003cul\u003e\u003cli\u003eenterprise enrollment after a powerwash will fail\u003c/li\u003e\u003cli\u003eshared-data disk encryption key will not have changed\u003c/li\u003e\u003cli\u003elockbox \u0026amp; tpm data must be manually preserved using \"safe\"\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eConstraints on v1/Additional work needed:\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eEnterprise enrolled devices cannot be reset using this mechanism.\u003c/li\u003e\u003cul\u003e\u003cli\u003eThe UI does not support it.\u003c/li\u003e\u003cli\u003eThe implementation may not allow re-enrollment after a wipe (if the UI supported it).\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecrossystem clear_tpm_owner_request is not in use.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/powerwash"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5400267747743172725"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5400267747743172725"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5400267747743172725"}],"author":[{"name":{"$t":"Will Drewry"},"email":{"$t":"wad@chromium.org"}}],"sites$pageName":{"$t":"powerwash"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4760560321051925150"},"published":{"$t":"2017-09-11T12:17:40.960Z"},"updated":{"$t":"2018-10-01T11:14:19.274Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-10-01T11:14:17.371Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Trusted Platform Module firmware vulnerability: technical documentation"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Vulnerability-description\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eVulnerability description\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Impacted-features\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eImpacted features\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mitigations\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eMitigations\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Affected-TPM-firmware-versions\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eAffected TPM firmware versions\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Affected-devices\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eAffected devices\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-TPM-firmware-update\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eTPM firmware update\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chrome-OS-versions-including-the-firmware-update\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eChrome OS versions including the firmware update\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Things-to-know-about-the-update-process\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eThings to know about the update process\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Deciding-whether-to-install-the-update\"\u003e\u003cstrong\u003e6.3 \u003c/strong\u003eDeciding whether to install the update\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Installing-the-update\"\u003e\u003cstrong\u003e6.4 \u003c/strong\u003eInstalling the update\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Retrying-a-failed-update\"\u003e\u003cstrong\u003e6.5 \u003c/strong\u003eRetrying a failed update\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Troubleshooting-recovery-failure\"\u003e\u003cstrong\u003e6.6 \u003c/strong\u003eTroubleshooting recovery failure\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Subsequent-TPM-firmware-update-prompt\"\u003e\u003cstrong\u003e6.7 \u003c/strong\u003eSubsequent TPM firmware update prompt\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Manually-Updating\"\u003e\u003cstrong\u003e6.8 \u003c/strong\u003eManually Updating\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Vulnerability-description\" /\u003eVulnerability description\u003c/h2\u003e\r\n\u003cp\u003eThere is a bug in certain Infineon TPM firmware versions which results in RSA keys generated by the TPM being vulnerable to an attack that allows to recover the private half of the RSA key from just the public key. The researchers who found the vulnerability have published high-level information here: \u003ca href\u003d\"https://crocs.fi.muni.cz/public/papers/rsa_ccs17\" rel\u003d\"nofollow\"\u003ehttps://crocs.fi.muni.cz/public/papers/rsa_ccs17\u003c/a\u003e. Currently known exploits are computationally expensive; specifically, for RSA keys of bit size 2048, the researchers give an estimate of 140.8 CPU years to break a single key. Note that this figure might drop as more researchers look at the attack. At the current point in time, it means TPM-generated RSA keys can't be broken at large scale, but targeted attacks are possible. To summarize: There exists a practical attack against TPM-generated RSA keys, but it doesn't allow large-scale exploitation of Chrome OS devices.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Impacted-features\" /\u003eImpacted features\u003c/h2\u003e\r\n\u003cp\u003eChrome OS relies on TPM-generated RSA keys for a number of features:\u003c/p\u003e\r\n\u003col\u003e\r\n\u003cli\u003e\r\n\u003cp\u003e\r\nSlowing down brute-force attacks against encrypted user data. The page \u003ca href\u003d\"http://dev.chromium.org/chromium-os/chromiumos-design-docs/protecting-cached-user-data\"\u003eProtecting Cached User Data\u003c/a\u003e describes this in more detail. The vulnerability allows the attacker to brute-force the encryption key (bit size 2048) off-device. However, note that off-device brute-force attacks are only advantageous against strong passwords - weak passwords are still less expensive to brute-force against the TPM regardless of whether it runs vulnerable firmware or not.\r\n\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003e\r\nHardware-backed encryption keys / certificates. Chrome OS allows users to generate and import RSA keys that are protected by the TPM so the main OS can't access the private key. These keys are typically accompanied by a certificate and then used in network authentication, such as WPA2-EAP, HTTPS client authentication, etc. The vulnerability allows attackers to determine the private key. The bit size of generated and imported keys depends on parameters. The bit sizes supported by Chrome OS for TPM-backed keys are 1024 or 2048. You can check key sizes for certificates backed by TPM keys at chrome://settings/certificates.\r\n\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003e\r\nChrome OS \u003ca href\u003d\"https://support.google.com/chrome/a/answer/7156268\"\u003eVerified Access\u003c/a\u003e allows network services to verify client device integrity and identity. TPM-generated RSA keys (bit size 2048) are used in the certification process. Attackers can exploit the vulnerability to break an \"Attestation Identity Key\", which allows them to impersonate a legit device from an endpoint of their choice.\r\n\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Mitigations\" /\u003eMitigations\u003c/h2\u003e\r\n\u003cp\u003eIn Chrome OS M60, we strengthened Chrome OS user data protection using the scrypt password hashing scheme to act as a second line of defense even in case the brute-force protection afforded by the TPM is lost. Users were automatically upgraded to the new scheme behind the scenes without user-observable effects. This measure guarantees adequate protection of encrypted user data for users that use strong passwords. If your password isn't strong, now is a good time to fix this - the risk involved with using a weak password generally transcends Chrome OS and affects other places that store sensitive data.\u003c/p\u003e\r\n\u003cp\u003eFor hardware-backed encryption keys and Verified Access, mitigations are technically infeasible without losing the hardware binding, and thus breaking the feature. The only supported path to restore the designed security strength for these features is to update TPM firmware.\u003c/p\u003e\r\n\u003cp\u003eSee below for advice on whether and when to update TPM firmware.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Affected-TPM-firmware-versions\" /\u003eAffected TPM firmware versions\u003c/h2\u003e\r\n\u003cp\u003eYou can check the TPM firmware running on your device by looking at the firmware_version line of the tpm_version entry in chrome://system. If the tpm_version entry is absent, this is likely because you are running an old Chrome OS version which doesn't report this information. Upgrade to a newer version and check again.\u003c/p\u003e\r\n\u003cp\u003eVulnerable firmware versions used on Chrome OS are (listing the firmware_version value from chrome://system as well as the human-readable version number):\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e000000000000041f - 4.31\u003c/li\u003e\r\n\u003cli\u003e0000000000000420 - 4.32\u003c/li\u003e\r\n\u003cli\u003e0000000000000628 - 6.40\u003c/li\u003e\r\n\u003cli\u003e0000000000008520 - 133.32\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003eFixed firmware versions are as follows:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e0000000000000422 - 4.34\u003c/li\u003e\r\n\u003cli\u003e000000000000062b - 6.43\u003c/li\u003e\r\n\u003cli\u003e0000000000008521 - 133.33\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Affected-devices\" /\u003eAffected devices\u003c/h2\u003e\r\n\u003cp\u003eWith the exception of older devices that use the Infineon SLB 9635 TPM, all Chrome OS devices that include an Infineon TPM chip are affected. Here is the complete list of affected devices with code names and marketing names:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003easuka - Dell Chromebook 13 3380\u003c/li\u003e\r\n\u003cli\u003eauron-paine - Acer Chromebook 11 (C740)\u003c/li\u003e\r\n\u003cli\u003eauron-yuna - Acer Chromebook 15 (CB5-571)\u003c/li\u003e\r\n\u003cli\u003ebanjo - Acer Chromebook 15 (CB3-531)\u003c/li\u003e\r\n\u003cli\u003ebanon - Acer Chromebook 15 (CB3-532)\u003c/li\u003e\r\n\u003cli\u003ebuddy - Acer Chromebase 24\u003c/li\u003e\r\n\u003cli\u003ecandy - Dell Chromebook 11 (3120)\u003c/li\u003e\r\n\u003cli\u003ecaroline - Samsung Chromebook Pro\u003c/li\u003e\r\n\u003cli\u003ecave - ASUS Chromebook Flip C302\u003c/li\u003e\r\n\u003cli\u003eceles - Samsung Chromebook 3\u003c/li\u003e\r\n\u003cli\u003echell - HP Chromebook 13 G1\u003c/li\u003e\r\n\u003cli\u003eclapper - Lenovo N20 Chromebook\u003c/li\u003e\r\n\u003cli\u003ecyan - Acer Chromebook R11 (CB5-132T / C738T)\u003c/li\u003e\r\n\u003cli\u003edaisy-skate - HP Chromebook 11 2000-2099 / HP Chromebook 11 G2\u003c/li\u003e\r\n\u003cli\u003edaisy-spring - HP Chromebook 11 1100-1199 / HP Chromebook 11 G1\u003c/li\u003e\r\n\u003cli\u003eedgar - Acer Chromebook 14 (CB3-431)\u003c/li\u003e\r\n\u003cli\u003eelm - Acer Chromebook R13 (CB5-312T)\u003c/li\u003e\r\n\u003cli\u003eenguarde - ASI Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - Crambo Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - CTL N6 Education Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - Education Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - eduGear Chromebook R\u003c/li\u003e\r\n\u003cli\u003eenguarde - Edxis Education Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - JP Sa Couto Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - Lenovo N21 Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - M\u0026amp;A Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - RGS Education Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - Senkatel C1101 Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - True IDC Chromebook\u003c/li\u003e\r\n\u003cli\u003eenguarde - Videonet Chromebook\u003c/li\u003e\r\n\u003cli\u003eexpresso - Bobicus Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eexpresso - Consumer Chromebook\u003c/li\u003e\r\n\u003cli\u003eexpresso - Edxis Chromebook\u003c/li\u003e\r\n\u003cli\u003eexpresso - HEXA Chromebook Pi\u003c/li\u003e\r\n\u003cli\u003efalco - HP Chromebook 14\u003c/li\u003e\r\n\u003cli\u003egandof - Toshiba Chromebook 2 (2015 Edition)\u003c/li\u003e\r\n\u003cli\u003eglimmer - Lenovo ThinkPad 11e Chromebook\u003c/li\u003e\r\n\u003cli\u003egnawty - Acer Chromebook 11 (C730 / C730E)\u003c/li\u003e\r\n\u003cli\u003egnawty - Acer Chromebook 11 (C735)\u003c/li\u003e\r\n\u003cli\u003eguado - ASUS Chromebox CN62\u003c/li\u003e\r\n\u003cli\u003ehana - Lenovo N23 Yoga/Flex 11 Chromebook\u003c/li\u003e\r\n\u003cli\u003ehana - Poin2 Chromebook 14\u003c/li\u003e\r\n\u003cli\u003eheli - Haier Chromebook 11 G2\u003c/li\u003e\r\n\u003cli\u003ekefka - Dell Chromebook 11 Model 3180\u003c/li\u003e\r\n\u003cli\u003ekefka - Dell Chromebook 11 3189\u003c/li\u003e\r\n\u003cli\u003ekevin - Samsung Chromebook Plus\u003c/li\u003e\r\n\u003cli\u003ekip - HP Chromebook 11 2100-2199 / HP Chromebook 11 G3\u003c/li\u003e\r\n\u003cli\u003ekip - HP Chromebook 11 2200-2299 / HP Chromebook 11 G4/G4 EE\u003c/li\u003e\r\n\u003cli\u003ekip - HP Chromebook 14 ak000-099 / HP Chromebook 14 G4\u003c/li\u003e\r\n\u003cli\u003elars - Acer Chromebook 11 (C771, C771T)\u003c/li\u003e\r\n\u003cli\u003elars - Acer Chromebook 14 for work (CP5-471)\u003c/li\u003e\r\n\u003cli\u003eleon - Toshiba Chromebook\u003c/li\u003e\r\n\u003cli\u003elink - Google Chromebook Pixel\u003c/li\u003e\r\n\u003cli\u003elulu - Dell Chromebook 13 7310\u003c/li\u003e\r\n\u003cli\u003emccloud - Acer Chromebox\u003c/li\u003e\r\n\u003cli\u003emonroe - LG Chromebase 22CB25S\u003c/li\u003e\r\n\u003cli\u003emonroe - LG Chromebase 22CV241\u003c/li\u003e\r\n\u003cli\u003eninja - AOPEN Chromebox Commercial\u003c/li\u003e\r\n\u003cli\u003enyan-big - Acer Chromebook 13 (CB5-311)\u003c/li\u003e\r\n\u003cli\u003enyan-blaze - HP Chromebook 14 x000-x999 / HP Chromebook 14 G3\u003c/li\u003e\r\n\u003cli\u003enyan-kitty - Acer Chromebase\u003c/li\u003e\r\n\u003cli\u003eorco - Lenovo 100S Chromebook\u003c/li\u003e\r\n\u003cli\u003epanther - ASUS Chromebox CN60\u003c/li\u003e\r\n\u003cli\u003epeach-pi - Samsung Chromebook 2 13\"\u003c/li\u003e\r\n\u003cli\u003epeach-pit - Samsung Chromebook 2 11\"\u003c/li\u003e\r\n\u003cli\u003epeppy - Acer C720 Chromebook\u003c/li\u003e\r\n\u003cli\u003equawks - ASUS Chromebook C300\u003c/li\u003e\r\n\u003cli\u003ereks - Lenovo N22 (Touch) Chromebook\u003c/li\u003e\r\n\u003cli\u003ereks - Lenovo N23 Chromebook\u003c/li\u003e\r\n\u003cli\u003ereks - Lenovo N23 Chromebook (Touch)\u003c/li\u003e\r\n\u003cli\u003ereks - Lenovo N42 (Touch) Chromebook\u003c/li\u003e\r\n\u003cli\u003erelm - Acer Chromebook 11 N7 (C731)\u003c/li\u003e\r\n\u003cli\u003erelm - CTL NL61 Chromebook\u003c/li\u003e\r\n\u003cli\u003erelm - Edxis Education Chromebook\u003c/li\u003e\r\n\u003cli\u003erelm - HP Chromebook 11 G5 EE\u003c/li\u003e\r\n\u003cli\u003erelm - Mecer V2 Chromebook\u003c/li\u003e\r\n\u003cli\u003erikku - Acer Chromebox CXI2\u003c/li\u003e\r\n\u003cli\u003esamus - Google Chromebook Pixel (2015)\u003c/li\u003e\r\n\u003cli\u003esentry - Lenovo Thinkpad 13 Chromebook\u003c/li\u003e\r\n\u003cli\u003esetzer - HP Chromebook 11 G5 / HP Chromebook 11-vxxx\u003c/li\u003e\r\n\u003cli\u003esquawks - ASUS Chromebook C200\u003c/li\u003e\r\n\u003cli\u003esumo - AOpen Chromebase Commercial\u003c/li\u003e\r\n\u003cli\u003eswanky - Toshiba Chromebook 2\u003c/li\u003e\r\n\u003cli\u003eterra - ASUS Chromebook C202SA\u003c/li\u003e\r\n\u003cli\u003eterra - ASUS Chromebook C300SA/C301SA\u003c/li\u003e\r\n\u003cli\u003etidus - Lenovo ThinkCentre Chromebox\u003c/li\u003e\r\n\u003cli\u003etricky - Dell Chromebox\u003c/li\u003e\r\n\u003cli\u003eultima - Lenovo ThinkPad 11e Chromebook 3rd Gen (Yoga/Clamshell)\u003c/li\u003e\r\n\u003cli\u003eveyron-fievel - AOpen Chromebox Mini\u003c/li\u003e\r\n\u003cli\u003eveyron-jaq - Haier Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eveyron-jaq - Medion Akoya S2013\u003c/li\u003e\r\n\u003cli\u003eveyron-jaq - True IDC Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eveyron-jaq - Xolo Chromebook\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - CTL J2 / J4 Chromebook for Education\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - eduGear Chromebook K Series\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - Epik 11.6\" Chromebook ELB1101\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - HiSense Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - Mecer Chromebook\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - NComputing Chromebook CX100\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - Poin2 Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - Positivo Chromebook CH1190\u003c/li\u003e\r\n\u003cli\u003eveyron-jerry - VideoNet Chromebook BL10\u003c/li\u003e\r\n\u003cli\u003eveyron-mickey - ASUS Chromebit CS10\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Chromebook PCM-116E\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - eduGear Chromebook M Series\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Haier Chromebook 11e\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Lumos Education Chromebook\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - MEDION Chromebook S2015\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Nexian Chromebook 11.6-inch\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Prowise 11.6\" Entry Line Chromebook\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Sector 5 E1 Rugged Chromebook\u003c/li\u003e\r\n\u003cli\u003eveyron-mighty - Viglen Chromebook 11\u003c/li\u003e\r\n\u003cli\u003eveyron-minnie - ASUS Chromebook Flip C100PA\u003c/li\u003e\r\n\u003cli\u003eveyron-speedy - ASUS Chromebook C201PA\u003c/li\u003e\r\n\u003cli\u003eveyron-tiger - AOpen Chromebase Mini\u003c/li\u003e\r\n\u003cli\u003ewinky - Samsung Chromebook 2 11 - XE500C12\u003c/li\u003e\r\n\u003cli\u003ewizpig - CTL J5 Chromebook\u003c/li\u003e\r\n\u003cli\u003ewizpig - Edugear CMT Chromebook\u003c/li\u003e\r\n\u003cli\u003ewizpig - Haier Convertible Chromebook 11 C\u003c/li\u003e\r\n\u003cli\u003ewizpig - PCMerge Chromebook PCM-116T-432B\u003c/li\u003e\r\n\u003cli\u003ewizpig - Prowise ProLine Chromebook\u003c/li\u003e\r\n\u003cli\u003ewizpig - Viglen Chromebook 360\u003c/li\u003e\r\n\u003cli\u003ewolf - Dell Chromebook 11\u003c/li\u003e\r\n\u003cli\u003ezako - HP Chromebox CB1-(000-099) / HP Chromebox G1/ HP Chromebox for Meetings\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-TPM-firmware-update\" /\u003eTPM firmware update\u003c/h2\u003e\r\n\u003cp\u003eRecent Chrome OS builds of version M61 and later include functionality to install a TPM firmware update on the affected devices. After installing the update, RSA keys generated by the TPM are no longer vulnerable against the attack described above.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chrome-OS-versions-including-the-firmware-update\" /\u003eChrome OS versions including the firmware update\u003c/h3\u003e\r\n\u003cp\u003eThe following Chrome OS versions include the TPM firmware update for affected devices (note that chromium OS builds do not contain firmware files):\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eChrome OS M61 - build 9765.81.0 and later\u003c/li\u003e\r\n\u003cli\u003eChrome OS M62 - build 9901.42.0 and later\u003c/li\u003e\r\n\u003cli\u003eChrome OS M63 - build 10020.0.0 and later\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eThe one exception is link / Google Chromebook Pixel, for which the TPM firmware update functionality is not enabled yet. There is a problem with firmware update installation on that device, we intend to ship an update with a fix to enable the TPM firmware update as soon as possible.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Things-to-know-about-the-update-process\" /\u003eThings to know about the update process\u003c/h3\u003e\r\n\u003cp\u003eInstalling the TPM firmware update requires a hardware reset of the TPM chip. This means that all data held by the TPM will be discarded. This includes disk encryption keys, implying all user data stored locally on the device will be lost. Thus, you need to carefully backup any important data before you install the update.\u003c/p\u003e\r\n\u003cp\u003eWe are actively working on ways to allow updated TPM firmware to be installed without losing all data on the device. Launch dates for these non-destructive update flows are not confirmed at this point though.\u003c/p\u003e\r\n\u003cp\u003eThere is also a risk that the update will fail e.g. due to loss of power while installing the update. See \u003cb\u003ebelow\u003c/b\u003e for more information on how to recover from this situation. You'll need Chrome OS recovery media in order to invoke the recovery flow. You will want to make sure that you either prepare it before starting the TPM firmware update just in case or have another computer available to create recovery media in case you need it.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Deciding-whether-to-install-the-update\" /\u003eDeciding whether to install the update\u003c/h3\u003e\r\n\r\n\u003cp\u003eThere is no one-size-fits-all advice on whether to install the update or not. As described above, there are inherent inconveniences and risks associated with the update process and a limited set of features is impacted by the vulnerability. In order to help make an informed decision, here is some guidance. If any of the following applies, consider installing the update:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\r\n\u003cp\u003eYou rely on the highest level of protection that Chrome OS can offer for your encrypted user data (TPM-backed protection against password brute-forcing attacks).\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eYou are using hardware-backed encryption keys and corresponding certificates to access network services such as corporate web sites, VPNs. etc. If you're unsure you can check the \"your certificates\" section in chrome://settings/certificates to see whether you have any hardware-backed certificates.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eYou are using \u003ca href\u003d\"https://support.google.com/chrome/a/answer/7156268\"\u003eVerified Access\u003c/a\u003e for device authentication on your enterprise-managed Chrome OS devices. When in doubt, ask your administrator.\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eIf none of the bullets above apply to you, you don't benefit from the update and can safely skip it, thus avoiding potential complications due to failing updates as described above.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Installing-the-update\" /\u003eInstalling the update\u003c/h3\u003e\r\n\r\n\u003cp\u003eDue to the implied loss of data, users must trigger the update explicitly. To do so, users can opt in to installing the TPM firmware update as part of the \u003ca href\u003d\"https://support.google.com/chromebook/answer/183084\"\u003efactory reset flow\u003c/a\u003e also known as \"powerwash\". Note that for enterprise-managed devices, the powerwash UI is not regularly available. We have added a TPM firmware update device policy though which admins can set to make the TPM firmware update via powerwash available to their users.\u003c/p\u003e\r\n\u003cp\u003eThe steps are as follows:\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003e\r\n\u003cp\u003eTrigger the powerwash flow, either via Ctrl+Alt+Shift+r on the login screen, or via the powerwash option in chrome://settings \u0026gt; Advanced.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eThe flow will ask you to reboot unless you have just restarted your device anyways.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eIn the powerwash dialog, there will be a checkbox \"Update firmware for added security.\" Check it in order to request the TPM firmware update to be installed.\u003cbr /\u003e\r\nIf you don't see a checkbox, this can be due to a number of reasons:\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003col\u003e\u003cli\u003e\r\n\u003cp\u003eYour device already runs updated firmware, check chrome://system as described above to confirm.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eYou are running an older Chrome OS version that doesn't include functionality to update TPM firmware. Upgrade to a newer OS version.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eOnce you click the \"Powerwash\" button and confirm, the device will reboot.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eAfter the reboot, you'll see a message indicating that the powerwash is in progress. Wait for it to complete, after which the device will reboot again.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eAfter the second reboot, the device will show a message screen when installing the firmware update. There is a progress bar that will be updated as the update progresses. The device will reboot once more after installing the update.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eAfter the third reboot, you'll see the familiar Chrome OS UI again showing the out of box experience. Your device is just as new, so you can go through the setup flow again and then log in as usual.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eIt’s worth double-checking you are running fixed TPM firmware by checking the tpm_version entry in chrome://system. See the \u003cb\u003eAffected TPM firmware versions\u003c/b\u003e section for details.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Retrying-a-failed-update\" /\u003eRetrying a failed update\u003c/h3\u003e\r\n\r\n\u003cp\u003eThere is a risk that the device will no longer boot if the update fails. This happens when the update installation gets interrupted while on the installation progress screen, for example due to power loss. The device will show a screen saying \"Chrome OS is missing or damaged\". If you press Tab on this screen, you'll see some additional information including a line labelled \"recovery_reason\". If the boot failure was due to an earlier failed TPM firmware update, you'll likely see \"Secure NVRAM (TPM) initialization error\" as \"recovery_reason\".\u003c/p\u003e\r\n\u003cp\u003eDevices in this state can be recovered via \u003ca href\u003d\"https://support.google.com/chromebook/answer/1080595\"\u003eChrome OS recovery\u003c/a\u003e. Recovery images for versions that have the TPM firmware update (see above) include functionality to retry a TPM firmware update that has previously failed. Follow these steps to recover:\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003e\r\n\u003cp\u003eMake absolutely sure that your device is connected to a reliable power source and has a charged battery (if applicable).\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003ePress Esc+Refresh+Power (keep holding Esc+Refresh for a while after releasing power) in order to start recovery mode. The device will boot to a screen that says \"Chrome OS is missing or damaged\" (older devices) or \"Please insert a recovery USB stick or SD card\" (newer devices).\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003ePlug the recovery media.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eThe device will launch the recovery procedure, starting with verification of the recovery media.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eIf the recovery software determines the TPM has encountered a previous failed update, it will automatically launch the TPM firmware update installation process. You'll see a screen indicating the update is getting installed, with a progress bar getting updated as the update progresses.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eAfter successful installation of the update, the device will reboot. Afterwards, the device should boot to the familiar Chrome OS UI again showing the out-of-box experience.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Troubleshooting-recovery-failure\" /\u003eTroubleshooting recovery failure\u003c/h3\u003e\r\n\u003cp\u003eThe recovery software will show a screen saying \"The security module on this device is not working\" if it encounters a bug or a condition that the recovery software is unable to fix. If you see this, you'll want to ask for help either via \u003ca href\u003d\"https://productforums.google.com/forum/#!forum/chromebook-central\"\u003eChromebook Central Help Forum\u003c/a\u003e or via EDU / enterprise support channels (if applicable). There are some important pieces of evidence to gather that are helpful in figuring out the root cause of the failure:\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003e\r\n\u003cp\u003eHold on to recovery media. The recovery software stores diagnostic information on it, so do not use it for recovery attempts on other devices and do not overwrite otherwise. The log files can be found on the first partition under \"recovery_logs\" and contain a trace of the recovery software execution flow which is invaluable in tracking down the root cause for the failure.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n\u003cp\u003eTake note of the information shown by pressing Tab on the \"Chrome OS is missing or damaged screen\" e.g. by snapping a photo. The recovery_reason line is particularly interesting as it may indicate clues as to what state the TPM is in.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Subsequent-TPM-firmware-update-prompt\" /\u003eSubsequent TPM firmware update prompt\u003c/h3\u003e\u003cdiv\u003eDue to a \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/detail?id\u003d872746\"\u003ebug\u003c/a\u003e in the original implementation of the TPM firmware update flow, a vulnerable Storage Root Key (a key held in the TPM that is used to encrypt other keys) from before the update may remain even after completing the update. This affects a small number of devices that did not finish the TPM firmware update in normal boot mode but only after retry using a recovery image. This can be addressed by performing another powerwash \u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eto clear the TPM again and thus regenerate a new Storage Root Key that is not vulnerable.\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e Chrome OS M70 and later will show a one-time system notification saying \"Security upgrade available\" / \"Reset your Chromebook to upgrade your security\" for each user to alert of them of the situation. Users should re-evaluate their situation per the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/tpm_firmware_update#TOC-Things-to-know-about-the-update-process\"\u003eadvice\u003c/a\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/tpm_firmware_update#TOC-Deciding-whether-to-install-the-update\"\u003eabove\u003c/a\u003e to decide whether they want to perform the powerwash, which can be triggered by invoking the firmware update flow again via chrome://chrome.\u003c/span\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Manually-Updating\" /\u003eManually Updating\u003c/h3\u003e\r\n\u003cp\u003eIf you want to apply the update manually for any reason (e.g. you're using a Chromebook Pixel (link)), here's the steps required.\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003ePut the device into dev mode\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eSee the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices\"\u003eofficial list of devices\u003c/a\u003e for more details\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eIf you're already in dev mode, you'll need to \u003ca href\u003d\"https://support.google.com/chromebook/answer/183084\"\u003ePowerwash\u003c/a\u003e or go through \u003ca href\u003d\"https://support.google.com/chromebook/answer/1080595\"\u003erecovery\u003c/a\u003e to reset the TPM back to the correct initial state\u003c/li\u003e\r\n\u003cli\u003eBoot the device until you get to the initial OOBE screen (where you select network/etc...)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eDon't sign in!\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eSwitch to a console by pressing Ctrl-Alt-F2 (the -\u0026gt; key is the same as F2)\u003c/li\u003e\r\n\u003cli\u003eLog in using the \"root\" username (there should be no password)\u003c/li\u003e\r\n\u003cli\u003eType this command (all on one line):\u003cbr /\u003e\r\n\u003ccode\u003edbus-send --system --dest\u003dorg.chromium.SessionManager --type\u003dmethod_call /org/chromium/SessionManager org.chromium.SessionManagerInterface.StartTPMFirmwareUpdate string:first_boot\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eAfter a few seconds, the device should reboot\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eIf the device doesn't reboot, check \u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003e/var/log/messages\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e.  If it says something about a user already having logged in, go back to step 2.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003ePress Ctrl-D to boot\u003c/li\u003e\r\n\u003cli\u003eWait for the powerwash step to finish and reboot (should be quick)\u003c/li\u003e\r\n\u003cli\u003ePress Ctrl-D to boot\u003c/li\u003e\r\n\u003cli\u003eWait for the installing update step to finish\u003c/li\u003e\u003cli\u003eIf the device reboots and takes you back to the login screen, you're done\u003c/li\u003e\u003cli\u003eIf you get an error, perform the steps described above to \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/tpm_firmware_update#TOC-Retrying-a-failed-update\"\u003eretry a failed update\u003c/a\u003e. Note that there is a known issue with original Chromebook Pixel (link) devices:The original TPM firmware version fails installing the firmware update just before completion. The device may or may not boot normally after turning it off and on again. It is critical to go through Chrome OS recovery again to reset the TPM into a good state and flush out all weak keys. You have been warned!\u003c/li\u003e\u003cli\u003eIf things still aren't working, then review the troubleshooting sections above\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/tpm_firmware_update"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4760560321051925150"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4760560321051925150"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4760560321051925150"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$pageName":{"$t":"tpm_firmware_update"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7657939493150579822"},"published":{"$t":"2018-09-17T18:29:27.431Z"},"updated":{"$t":"2018-09-21T21:51:34.205Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-21T21:46:45.306Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Leak Detection"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eWhen launching a new feature it is important to consider doing manual inspection to look for memory leaks since some types of leaks will not easily show up during other testing, especially if they are slow leaks. This can avoid bugs which are otherwise difficult to detect.\u003cdiv\u003e\u003cbr /\u003e\u003cdiv\u003eYou can look for memory leaks on Windows using ETW heap tracing using \u003ca href\u003d\"https://randomascii.wordpress.com/2015/09/01/xperf-basics-recording-a-trace-the-ultimate-easy-way/\" rel\u003d\"nofollow\"\u003eUIforETW\u003c/a\u003e, an open-source wrapper for Microsoft's ETW/WPT toolkit. To set up for heap tracing you need to download and run UIforETW, then:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eClick on Settings and set \"Heap-profiled processes\" to chrome.exe, check \"Chrome developer\", then close Settings\u003c/li\u003e\u003cli\u003eChange the tracing type (just below \"Input tracing\") to \"Heap tracing to file\"\u003c/li\u003e\u003cli\u003eClose all unnecessary programs including other copies of Chrome in order to reduce the trace size and noise\u003c/li\u003e\u003cli\u003eIf you need to record allocations that happen during startup then start tracing and then launch Chrome. If not then you should launch Chrome and wait for its startup activity to calm down. If you launch Chrome with a minimal set of tabs then this will reduce the trace size and noise\u003c/li\u003e\u003cli\u003eWhen you are ready to test your feature then type Ctrl+Win+R (with any window active) or click \"Start Tracing\" in UIforETW\u003c/li\u003e\u003cli\u003eRun your test a few times, let Chrome go idle again, and then type Ctrl+Win+R (with any window active) or click \"Save Trace Buffers\" in UIforETW\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eTips for efficient tracing:\u003c/div\u003e\u003cdiv\u003e\u003cul style\u003d\"font-size:13.3333px\"\u003e\u003cli\u003eIf you want to just heap-profile a renderer process then you should launch Chrome \u003ci\u003ebefore\u003c/i\u003e setting the tracing type. This will ensure that heap tracing is disabled for the browser, GPU, utility, extension, crashpad, and watcher processes. Only processes launched \u003ci\u003eafter\u003c/i\u003e you change the tracing type to \"Heap tracing to file\" will be heap traced, and only allocations/frees done after you start tracing will be recorded.\u003c/li\u003e\u003cli\u003eIf you are only going to be looking at heap data then uncheck \"Context switch call stacks\" and \"CPU sampling call stacks\" in order to keep the trace as small as possible\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThese trace analysis instructions are very terse because a full explanation would require many pages. If you need assistance then please contact brucedawson@chromium.org.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have Python installed then IdentifyChromeProcesses.py will be run and a list of Chrome process types and PIDs will be printed, which helps with identifying the browser process, etc. If you need to identify a specific render process PID then use Chrome's Task Manager. You can copy the trace to a different machine for analysis, and you can manually run IdentifyChromeProcesses.py on that machine by right-clicking on the trace name and selecting Scripts-\u0026gt; Identify Chrome Processes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eOpen the trace in WPA. The default view is designed for analyzing performance rather than allocations so you will want to use HeapAnalysis.wpaProfile from UIforETW's bin directory (available in versions published in September 2018 or later). You can apply this profile by going to the Profiles menu in WPA, selecting Apply... and then browsing to the .wpaProfile file. Load symbols (Trace-\u0026gt; Load Symbols) and you can then drill down into the allocations for the process of interest. The Type column will usually list AIFI and AIFO types. AIFI means Allocated Inside and Freed Inside - meaning that the allocation was transient within the visible time range. AIFO means Allocated Inside and Freed Outside meaning that the memory was allocated but not freed within the visible time range. AIFO allocations are potential leaks. You can drill down through the stack, sorting by Count, or Size, or you can search for particular symbols by typing Ctrl+F when the Stack column is selected.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe allocation times for the selected portion of stack will be highlighted in the graph area, giving clues to patterns. These can be compared against input events emitted by UIforETW.exe.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIt is also possible to use Visual Studio's heap profiler. This is particularly convenient for profiling the browser process at startup.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/leak-detection"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7657939493150579822"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7657939493150579822"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7657939493150579822"}],"author":[{"name":{"$t":"Bruce Dawson"},"email":{"$t":"brucedawson@chromium.org"}}],"sites$pageName":{"$t":"leak-detection"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2600057251611789483"},"published":{"$t":"2014-07-11T18:12:43.403Z"},"updated":{"$t":"2018-09-21T18:19:53.713Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-21T18:19:51.736Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"PDFium Security"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eWelcome to PDFium Security!\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Basic-Info\" /\u003eBasic Info\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://code.google.com/p/pdfium/\" target\u003d\"_blank\"\u003ePDFium project page\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://pdfium.googlesource.com/\" target\u003d\"_blank\"\u003ePDFium Git repository\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dCr%3DInternals-Plugins-PDF+Type%3DBug-Security+\u0026amp;colspec\u003dID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified\u0026amp;cells\u003dtiles\" target\u003d\"_blank\"\u003eKnown PDFium security issues\u003c/a\u003e (Please pick 1 and fix it!)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Integer-Overflow\" /\u003eInteger Overflow\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eWe want to standardize on handling integer overflows by:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePreferring \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003enew[]\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003enew\u003c/font\u003e instead of \u003cfont face\u003d\"courier new, monospace\"\u003ecalloc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, wherever possible.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIn places where the code is not ready to be turned into idiomatic C++, preferring \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecalloc\u003c/font\u003e to \u003cfont face\u003d\"courier new, monospace\"\u003emalloc\u003c/font\u003e; definitely prefer \u003cfont face\u003d\"courier new, monospace\"\u003ecalloc\u003c/font\u003e to \u003cfont face\u003d\"courier new, monospace\"\u003emalloc\u003c/font\u003e + \u003cfont face\u003d\"courier new, monospace\"\u003ememset\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePreferring \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eCheckedNumeric\u0026lt;T\u0026gt;\u003c/font\u003e to ad hoc checks.\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eFor convenience, use the existing typedefs for clarity, e.g. \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:10pt;background-color:transparent\"\u003etypedef base::CheckedNumeric\u0026lt;FX_DWORD\u0026gt; FX_SAFE_DWORD;\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e. If you need more typedefs like this, or if you need them more widely visible, don't hesitate to make the change.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003cdiv\u003eYes, that might look odd. Currently, the codebase mixes C++ and C memory allocation, and ultimately, we'd like to get the code to idiomatic C++11, but we're going to get there incrementally.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Uninitialized-Memory-References\" /\u003eUninitialized Memory References\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eWe want to standardize on handling uninitialized memory references with:\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eDefault constructors that do the right thing.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eExplicit initial values for all POD members in header files.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Git-Workflow\" /\u003eGit Workflow\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThe top line/subject line of the commit message should always be as \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eexplicit as possible. Not just \"fix bug\", but \"Fix UAF in \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eModulateFooContainer\" or \"Fix UMR in thing::DoStuff\".\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Future-Desiderata\" /\u003eFuture Desiderata\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eNo more non-\u003cfont face\u003d\"courier new, monospace\"\u003econst\u003c/font\u003e references (especially when used as out-parameters).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eUse \u003cfont face\u003d\"courier new, monospace\"\u003estd::unique_ptr\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003epdfium::RetainPtr.\u003c/font\u003e No more naked \u003cfont face\u003d\"courier new, monospace\"\u003enew\u003c/font\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/pdfium-security"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2600057251611789483"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2600057251611789483"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2600057251611789483"}],"author":[{"name":{"$t":"Chris Palmer"},"email":{"$t":"palmer@chromium.org"}}],"sites$pageName":{"$t":"pdfium-security"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"USl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5839539150440436229"},"published":{"$t":"2011-05-11T21:14:00.230Z"},"updated":{"$t":"2018-09-21T14:55:07.446Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-21T14:55:05.176Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Power testing"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"5\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThis documentation now lives \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/client/site_tests/power_LoadTest/README.md\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/power-testing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5839539150440436229"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5839539150440436229"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5839539150440436229"}],"author":[{}],"sites$pageName":{"$t":"power-testing"},"sites$revision":{"$t":"28"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1496056180583362869"},"published":{"$t":"2013-10-22T21:27:58.304Z"},"updated":{"$t":"2018-09-18T00:02:10.806Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-18T00:02:08.293Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Creating Private Board Overlays"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Private-forever-Features\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003ePrivate (forever) Features\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Private-Public-Boards\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003ePrivate \u0026amp; Public Boards\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Bare-Framework\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBare Framework\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-src-private-overlays-overlay--BOARD-private-\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003esrc/private-overlays/overlay-$BOARD-private/\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-metadata-layout.conf\"\u003e\u003cstrong\u003e2.1.1 \u003c/strong\u003emetadata/layout.conf\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-base-make.defaults\"\u003e\u003cstrong\u003e2.1.2 \u003c/strong\u003eprofiles/base/make.defaults\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-profiles-base-parent\"\u003e\u003cstrong\u003e2.1.3 \u003c/strong\u003eprofiles/base/parent\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-toolchain.conf\"\u003e\u003cstrong\u003e2.1.4 \u003c/strong\u003etoolchain.conf\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-src-third_party-chromiumos-overlay-eclass-cros-board.eclass\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003esrc/third_party/chromiumos-overlay/eclass/cros-board.eclass\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Board-Variant-Framework-advanced-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eBoard Variant Framework (advanced)\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003eIn the main \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide\"\u003eChromium OS Board Porting Guide\u003c/a\u003e, we covered how to create a new board overlay for a project. The goal there was to create a board that'd be published for anyone to build themselves. However, it is not uncommon for people to want to develop their boards in secret before launch, or to have a few pieces that never get publicly released. Chromium OS provides a framework for that too, and this guide covers that.\u003c/p\u003e\r\n\u003cp\u003eNote that this guide is not standalone. You should be familiar with the aforementioned board porting guide as we will not duplicate topics that are in common.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Private-forever-Features\" /\u003ePrivate (forever) Features\u003c/h3\u003e\r\n\u003cp\u003eSome examples of things that won't be released (whether it be practical or political or legal):\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eOEM Customizations like default login wallpapers or Chrome extensions\u003c/li\u003e\r\n\u003cli\u003eScripts used in factory settings to reset low level hardware when handling RMAs/etc...\u003c/li\u003e\r\n\u003cli\u003eSource code to proprietary drivers/firmware/etc...\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ethe public overlay should have a package that installs a prebuilt binary though\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eACLs to private Google Storage buckets\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Private-Public-Boards\" /\u003ePrivate \u0026amp; Public Boards\u003c/h3\u003e\r\n\u003cp\u003ePrivate and public overlays do not work in isolation. This means that if you have both private and public board overlays, they will both be used. This allows you to have a public overlay that includes as many releasable pieces as possible (and produce a usable image) while having a private overlay with just the few additional private-only pieces.\u003c/p\u003e\r\n\u003cp\u003eOften times people will start by creating only a private board overlay (which is a perfectly valid setup), and then once things have been released, create a public board overlay. This is the recommended workflow and you should keep this in mind when writing the private overlay -- don't make things harder for the public release. The goal of this guide is to show how to create a private overlay that is geared towards being released later on.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Bare-Framework\" /\u003eBare Framework\u003c/h2\u003e\r\n\u003cp\u003eWhile public overlays live in src/overlays/overlay-$BOARD/, private overlays live in src/private-overlays/overlay-$BOARD-private/. The file structure is the same though.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-src-private-overlays-overlay--BOARD-private-\" /\u003esrc/private-overlays/overlay-$BOARD-private/\u003c/h3\u003e\r\n\u003cp\u003eEven if you have a public overlay, you will need at least these files (even if there is no content in them like make.defaults):\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003eoverlay-$BOARD/\u003cbr /\u003e\r\n|-- metadata/\u003cbr /\u003e\r\n|   `-- layout.conf          # Copy of the public overlay version with updated repo-name\u003cbr /\u003e\r\n|-- profiles/\u003cbr /\u003e\r\n|   `-- base/\u003cbr /\u003e\r\n|       |-- make.defaults    # Private board customizations (USE/LINUX_FIRMWARE/etc...)\u003cbr /\u003e\r\n|       `-- parent           # Either same as the public overlay, or a link to it\u003cbr /\u003e\r\n`-- toolchain.conf           # Same as the public overlay\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eMost of these files are one or two lines.  Let's go through them one at a time.\u003c/p\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-metadata-layout.conf\" /\u003emetadata/layout.conf\u003c/h4\u003e\r\n\u003cp\u003eThis will be the same as the public overlay, except you'll want to add a \"-private\" suffix to the \"repo-name\" field. Here's what the private overlay for the lumpy board uses:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e$ cat metadata/layout.conf\u003cbr /\u003e\r\nmasters \u003d portage-stable chromiumos eclass-overlay\u003cbr /\u003e\r\nprofile-formats \u003d portage-2\u003cbr /\u003e\r\nrepo-name \u003d \u003cb\u003elumpy-private\u003c/b\u003e\u003cbr /\u003e\r\nthin-manifests \u003d true\u003cbr /\u003e\r\nuse-manifests \u003d strict\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-base-make.defaults\" /\u003eprofiles/base/make.defaults\u003c/h4\u003e\r\n\u003cp\u003eSince this will be a super set of the public overlay's make.defaults, use this form:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# NOTE: Only put private-specific stuff in this file.  If your settings\u003cbr /\u003e\r\n# can be used publicly, then use overlays/overlay-$BOARD/profiles/base/make.defaults\u003cbr /\u003e\r\n# instead.  There is no need to duplicate information -- these files stack.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# Initial value just for style purposes.\u003cbr /\u003e\r\nUSE\u003d\"\"\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nUSE\u003d\"${USE} private-specific-flags\"\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n# These are settings that today live in the private overlay, but may be moved to the public.\u003cbr /\u003e\r\nUSE\u003d\"${USE} public-flags\"\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-profiles-base-parent\" /\u003eprofiles/base/parent\u003c/h4\u003e\r\n\u003cp\u003eIf you have a public overlay already, then the preference would be to redirect to that. Here is how the private lumpy overlay does it:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ cat profiles/base/parent\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003elumpy:base\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eYou can still add private specific settings to the profile by adding files under profiles/base/.\u003c/p\u003e\r\n\u003cp\u003eIf you don't have a public overlay, then this will have the same content as if you had a public overlay (see the public porting guide for more info).\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-toolchain.conf\" /\u003etoolchain.conf\u003c/h4\u003e\r\n\u003cp\u003eFor now, this should be the same as the public overlay. We plan on making this incremental too, but haven't yet done so.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-src-third_party-chromiumos-overlay-eclass-cros-board.eclass\" /\u003esrc/third_party/chromiumos-overlay/eclass/cros-board.eclass\u003c/h3\u003e\r\n\u003cp\u003eEven though your board is private, you'll still need to update this central (public) location. It keeps us from stepping on each others toes.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Board-Variant-Framework-advanced-\" /\u003eBoard Variant Framework \u003ci\u003e(advanced)\u003c/i\u003e\u003c/h2\u003e\r\n\u003cp\u003eJust like the public overlays are allowed to have board variants, so can private boards. As you'd expect, the paths look like:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003esrc/private-overlays/overlay-$BOARD-private/\u003c/li\u003e\r\n\u003cli\u003esrc/private-overlays/overlay-variant-$OTHER_BOARD-private/\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/568658652243860188"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide/private-boards"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1496056180583362869"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1496056180583362869"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1496056180583362869"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"private-boards"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4971068017556214475"},"published":{"$t":"2018-05-29T17:37:07.034Z"},"updated":{"$t":"2018-09-06T17:30:23.340Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-06T17:30:21.263Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cross-Origin Read Blocking for Web Developers"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cb\u003eCross-Origin Read Blocking (CORB)\u003c/b\u003e is a new web platform security feature that helps mitigate the threat of side-channel attacks (including Spectre).  It is designed to prevent the browser from delivering certain cross-origin network responses to a web page, when they might contain sensitive information and are not needed for existing web features.  For example, it will block a cross-origin \u003cfont face\u003d\"courier new, monospace\"\u003etext/html\u003c/font\u003e response requested from a \u003cfont face\u003d\"courier new, monospace\"\u003e\u0026lt;script\u0026gt;\u003c/font\u003e or \u003cfont face\u003d\"courier new, monospace\"\u003e\u0026lt;img\u0026gt;\u003c/font\u003e tag, replacing it with an empty response instead.  This is an important part of the protections included with \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation\"\u003eSite Isolation\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eThis document aims to help web developers know what actions they should take in response to CORB.  For more information about CORB in general, please see the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md\"\u003eCORB explainer\u003c/a\u003e, the \u003ca href\u003d\"https://fetch.spec.whatwg.org/#corb\" rel\u003d\"nofollow\"\u003especification\u003c/a\u003e, the \u003ca href\u003d\"https://developers.google.com/web/updates/2018/07/site-isolation\"\u003e\"Site Isolation for web developers\" article\u003c/a\u003e, or the following \u003ca href\u003d\"https://youtu.be/dBuykrdhK-A\"\u003etalk\u003c/a\u003e from Google I/O 2018. (The CORB discussion starts at \u003ca href\u003d\"https://youtu.be/dBuykrdhK-A?t\u003d1401\"\u003earound 23:20 mark\u003c/a\u003e.)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed\" style\u003d\"width:480px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eLessons from Spectre and Meltdown, and how the whole web is getting safer \u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-youtube\"\u003e\u003ciframe title\u003d\"YouTube video player\" class\u003d\"youtube-player\" type\u003d\"text/html\" src\u003d\"https://www.youtube.com/embed/dBuykrdhK-A?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"480\" height\u003d\"270\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-can-I-ensure-CORB-protects-resources-on-my-website-\" /\u003eHow can I ensure CORB protects resources on my website?\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eTo make sure that sensitive resources on your website (e.g. pages or JSON files with \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003euser-specific information, or pages with CSRF tokens\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e) will not leak to other web origins, please take the following steps to distinguish them from resources that are allowed to be embedded by any site (e.g., images, JavaScript libraries).\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-For-HTML-JSON-and-XML-resources:\" /\u003eFor HTML, JSON, and XML resources:\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eMake sure these resources are served with a correct \"\u003cfont face\u003d\"courier new, monospace\"\u003eContent-Type\u003c/font\u003e\" response header from the list below, as well as a \"\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eX-Content-Type-Options: nosniff\u003c/font\u003e\" response header.  These headers ensure Chrome can identify the resources as needing protection, without depending on the contents of the resources.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://mimesniff.spec.whatwg.org/#html-mime-type\" rel\u003d\"nofollow\"\u003eHTML MIME type\u003c/a\u003e - \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/html\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://mimesniff.spec.whatwg.org/#xml-mime-type\" rel\u003d\"nofollow\"\u003eXML MIME type\u003c/a\u003e - \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/xml\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\", \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eapplication/xml\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\", or any MIME type whose subtype ends in \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e+xml\u003c/font\u003e\"\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"https://mimesniff.spec.whatwg.org/#json-mime-type\" rel\u003d\"nofollow\"\u003eJSON MIME type\u003c/a\u003e -\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:13.3333px\"\u003e \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px\"\u003etext/json\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:13.3333px\"\u003e\", \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px\"\u003eapplication/json\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-size:13.3333px\"\u003e\", or any MIME type whose subtype ends in \"\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:13.3333px\"\u003e+json\u003c/font\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\"\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eNote that we recommend not supporting \u003cb\u003emultipart\u003c/b\u003e \u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests\" rel\u003d\"nofollow\"\u003erange requests\u003c/a\u003e for sensitive resources, because this changes the MIME type to \u003cfont face\u003d\"courier new, monospace\"\u003emultipart/byteranges\u003c/font\u003e and makes it harder for Chrome to protect.  Typical range requests are not a problem and are treated similarly to the \u003cfont face\u003d\"courier new, monospace\"\u003enosniff\u003c/font\u003e case.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eIn addition to the recommended cases above, Chrome will also do its best to protect responses labeled with any of the MIME types above and without a \"\u003cfont face\u003d\"courier new, monospace\"\u003enosniff\u003c/font\u003e\" header, but this has limitations. Many JavaScript files on the web are unfortunately labeled using some of these MIME types, and if Chrome blocked access to them, existing websites would break. Thus, when the \"\u003cfont face\u003d\"courier new, monospace\"\u003enosniff\u003c/font\u003e\" header is not present, Chrome first looks at the start of the file to try to confirm whether it is HTML, XML, or JSON, before deciding whether to protect it.  If it cannot confirm this, it allows the response to be received by the cross-site page's process. This is a best-effort approach which adds some limited protection while preserving compatibility with existing sites.  We recommend that web developers include the \"\u003cfont face\u003d\"courier new, monospace\"\u003enosniff\u003c/font\u003e\" header to protect their resources, to avoid relying on this \"confirmation sniffing\" approach.\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-For-other-resource-types-e.g.-PDF-ZIP-PNG-:\" /\u003eFor other resource types (e.g., PDF, ZIP, PNG):\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eMake sure these resources are served only in response to requests that include an unguessable CSRF token (which should be distributed via resources protected via the HTML, JSON, or XML steps above).\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-What-should-I-do-about-CORB-warnings-reported-by-Chrome-\" /\u003eWhat should I do about CORB warnings reported by Chrome?\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eWhen CORB blocks a HTTP response, it emits the following warning message to the DevTools console in Chrome:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:rgb(255,242,204)\"\u003eCross-Origin Read Blocking (CORB) blocked cross-origin response https://www.example.com/example.html with MIME type text/html. See \u003ca href\u003d\"https://www.chromestatus.com/feature/5629709824032768\"\u003ehttps://www.chromestatus.com/feature/5629709824032768\u003c/a\u003e for more details.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e(In Chrome 66 and earlier, this message was slightly different: \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eBlocked current origin from receiving cross-site document at https://www.example.com/example.html with MIME type text/html.\u003c/font\u003e)\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eIn most cases, the blocked response should not affect the web page's behavior and the CORB error message can be safely ignored.  For example, the warning may occur in cases when the body of the blocked response was empty already, or when the response was going to be delivered to a context that can't handle it (e.g., a HTML document such as a 404 error page being delivered to an \u0026lt;img\u0026gt; tag).  \u003ci\u003e\u003cb\u003eNote: \u003c/b\u003eChrome will stop showing warning messages for empty or error responses in Chrome 69, since these are false positives that do not affect site behavior.  If you see CORB warnings in Chrome 67 or 68, please test the site in Chrome 69 to see if any warnings remain.\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eIn rare cases, the CORB warning message may indicate a problem on a website, which may disrupt its behavior when certain responses are blocked.  For example, a response served with a \"\u003cfont face\u003d\"courier new, monospace\"\u003eX-Content-Type-Options: nosniff\"\u003c/font\u003e response header and an incorrect \"\u003cfont face\u003d\"courier new, monospace\"\u003eContent-Type\u003c/font\u003e\" response header may be blocked.  This could, for example, block an actual image which is mislabeled as \"\u003cfont face\u003d\"courier new, monospace\"\u003eContent-Type: text/html\u003c/font\u003e\" and \"\u003cfont face\u003d\"courier new, monospace\"\u003enosniff\u003c/font\u003e.\"  If this occurs and interferes with a page's behavior, we recommend informing the website and requesting that they correct the \"\u003cfont face\u003d\"courier new, monospace\"\u003eContent-Type\u003c/font\u003e\" header for the response.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eIf you suspect Chrome is incorrectly blocking a response and that this is disrupting the behavior of a website, \u003ca href\u003d\"https://goo.gl/XBoKtY\"\u003eplease file a Chromium bug\u003c/a\u003e describing the incorrectly blocked response (both the headers and body) and/or the URL serving it.  You can confirm if a problem is due to CORB by temporarily disabling it, by starting Chrome with the following command line flag:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--disable-features\u003d\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eCrossSiteDocumentBlockingAlways,\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent;font-size:10pt\"\u003eCrossSiteDocumentBlockingIfIsolating\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/corb-for-developers"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4971068017556214475"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4971068017556214475"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4971068017556214475"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"corb-for-developers"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7582987878577786924"},"published":{"$t":"2009-11-19T17:03:49.188Z"},"updated":{"$t":"2018-09-05T17:52:06.030Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-10-31T17:23:09.771Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listpage","label":"listpage"}],"title":{"$t":"Developer Hardware"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Conventions\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eConventions\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-edit-the-list\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eHow to edit the list\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Developer-hardware-list\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDeveloper hardware list\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cb\u003e\u003ci\u003e\u003cspan\u003e    \u003c/span\u003eWarning: This page is for developers who both know how to build Chromium OS and aren't afraid to take a screwdriver to their computer.\u003c/i\u003e\u003c/b\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\u003cp\u003eThe list at the bottom of this page is a place for developers to contribute information about which developer systems are known to run Chromium OS, including what functionality works and what is broken. Please include details only on systems based on Chromium OS that \u003cb\u003edo not require changes to build\u003c/b\u003e (no additional drivers, new modules, changes to config files, and so on). Systems listed here need to \u003cb\u003erun the first time\u003c/b\u003e with the latest, unmodified Chromium OS source code.\r\n\u003c/p\u003e\r\n\r\n\u003cp\u003e\r\nPlease note that this list is not an endorsement of any particular system or hardware. This list is for developers to have systems to test and help other developers find hardware on which they can develop Chromium OS. We encourage all hardware vendors to to get their components working with Chromium OS. One of the best ways to achieve this goal is open-source, high-quality drivers for your components.\u003c/p\u003e\u003cp\u003eAlso note that this list is updated by request; it can get stale, and the presence of a device here is not a guarantee that Chromium OS will run on it.  (The fact that someone got it to run at one point makes it more likely that one could get it to run again with a bit of work, though.)  If you'd just like to give Chromium OS a try, your best bet is to run it on a virtual machine, as described on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/running-chromeos-image-under-virtual-machines\"\u003eRunning a Chromium OS image under KVM\u003c/a\u003e page.\u003c/p\u003e\r\n\u003cp\u003eIf you have questions about getting Chromium OS to run or would like to help get functionality working for a particular system, please join the \u003ca href\u003d\"http://groups.google.com/group/chromium-os-dev\" style\u003d\"color:rgb(51,102,153)\"\u003echromium-os-dev discussion group\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Conventions\" /\u003eConventions\u003c/h3\u003e\r\n\r\n\u003cp\u003e\r\nThe list has the following columns:\r\n\u003c/p\u003e\r\n\r\n\u003ctable\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eBrand \u0026amp; Model Number \u003cbr /\u003e\r\n\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eA brand and model number that are specific enough to indicate major components, such as which CPU is used\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eWifi\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eIf\u003cspan\u003e \"OK\", \u003c/span\u003ebasic wifi functionality works: link comes up and connects to a network (open/WPA). \"No\" indicates it's known to be broken. \"N/A\" means not applicable: there is no wifi card. If buying a new machine, try to choose one with working wifi. If you have a machine with non-working wifi, we recommend replacing the mini-PCIe card with an Atheros 9285 or Intel part (most Intel cards work).\u003cbr /\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eTrackpad\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eIf\u003cspan\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"color:rgb(0,102,204);outline-style:none;border-bottom-style:none\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258736133126/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif\" style\u003d\"border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\" /\u003e\u003c/a\u003e\u003c/span\u003e, the onscreen cursor can be controlled by the system's trackpad\u003c/td\u003e\r\n\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cb\u003eSuspend/Resume\u003c/b\u003e\u003c/td\u003e\u003ctd\u003eIf\u003cspan\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"color:rgb(0,102,204);outline-style:none;border-bottom-style:none\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258736133126/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif\" style\u003d\"border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\" /\u003e\u003c/a\u003e\u003c/span\u003e, the system will suspend/resume when the lid is closed/opened or power button is pressed\u003c/td\u003e\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eComments \u0026amp; Caveats\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eOther notes about the system that are important for other developers to know\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eContact\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eManufacturer contact email for hardware related questions about the system and Chromium OS\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"vertical-align:top;text-align:left;width:147px;height:18px\"\u003eBuy Link\u003c/th\u003e\r\n\u003ctd style\u003d\"vertical-align:top;width:644px;height:18px\"\u003eHelp other developers find this system!\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\u003cp\u003eIf a feature doesn't work (no  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"color:rgb(0,102,204);outline-style:none;border-bottom-style:none\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258736133126/chromium-os/getting-dev-hardware/dev-hardware-list/icon-checkmark.gif\" style\u003d\"border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\" /\u003e\u003c/a\u003e), add a comment with details on how the feature doesn't work or how to fix it.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-to-edit-the-list\" /\u003eHow to edit the list\u003c/h3\u003e\r\n\u003cp\u003eAnyone signed into an \u003cb\u003e@chromium.org\u003c/b\u003e address can modify this list. (If you don't see an \u003cb\u003eAdd item\u003c/b\u003e button below, \u003ca href\u003d\"https://www.google.com/a/UniversalLogin?md\u003dchromium.org\u0026amp;continue\u003dhttps%3A%2F%2Fsites.google.com%2Fa%2Fchromium.org%2Fdev%2Fchromium-os%2Fgetting-dev-hardware%2Fdev-hardware-list\u0026amp;service\u003djotspot\"\u003esign in\u003c/a\u003e. One way to get an @chromium.org address is to be a \u003ca href\u003d\"http://dev.chromium.org/getting-involved/become-a-committer\"\u003ecommitter\u003c/a\u003e.) In the spirit of wiki, the community is encouraged to remove inaccurate or unreproducible results. Repeat offenders will suffer the wrath of the wiki gods.\u003c/p\u003e\u003cp\u003eIf you do not have an @chromium.org address, feel free to e-mail \u003ca href\u003d\"mailto:vapier@chromium.org\"\u003evapier@chromium.org\u003c/a\u003e with the details you'd like to have added below.\u003c/p\u003e\u003cp\u003eNote that all Chrome OS branded devices should also run Chromium OS. We won't bother enumerating those.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Developer-hardware-list\" /\u003eDeveloper hardware list\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1665879686652625147"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/getting-dev-hardware/dev-hardware-list"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7582987878577786924"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7582987878577786924"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7582987878577786924"}],"author":[{}],"gs$worksheet":{"name":"Developer Hardware"},"gs$header":{"row":"1"},"gs$data":{"startRow":"2","gs$column":[{"index":"A","name":"Brand \u0026 Model Number"},{"index":"B","name":"Wifi"},{"index":"C","name":"Ethernet"},{"index":"D","name":"Trackpad"},{"index":"E","name":"Suspend/Resume"},{"index":"F","name":"Comments \u0026 Caveats"},{"index":"G","name":"Contact"},{"index":"H","name":"Buy Link"}]},"gd$feedLink":{"href":"https://sites.google.com/feeds/content/chromium.org/dev?parent\u003d7582987878577786924"},"sites$pageName":{"$t":"dev-hardware-list"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4869373600116439806"},"published":{"$t":"2018-09-04T18:18:03.494Z"},"updated":{"$t":"2018-09-04T18:18:03.528Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-09-04T18:18:03.494Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Case-Closed Debug in Chromebooks and Servo Micro.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4869373600116439806"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2836604984678896805"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servomicro/Case-Closed%20Debug%20in%20Chromebooks%20and%20Servo%20Micro.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4869373600116439806"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4869373600116439806"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4869373600116439806"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4869373600116439806"}],"author":[{"name":{"$t":"Debosmita Das"},"email":{"$t":"ddas@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6906659191246666649"},"published":{"$t":"2018-08-31T21:19:24.592Z"},"updated":{"$t":"2018-08-31T21:19:24.625Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-31T21:19:24.592Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"650-00588-01_20170601_servo_v4_pvt1_SCH_0.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6906659191246666649"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4434570074566878669"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/servo/servov4/650-00588-01_20170601_servo_v4_pvt1_SCH_0.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6906659191246666649"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6906659191246666649"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6906659191246666649"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6906659191246666649"}],"author":[{"name":{"$t":"Debosmita Das"},"email":{"$t":"ddas@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2662907783660237508"},"published":{"$t":"2010-09-22T00:07:09.086Z"},"updated":{"$t":"2018-08-29T01:02:42.758Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-29T01:02:40.094Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Triaging Bugs"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eYou don’t have to be a programmer to contribute to the Chromium project. There are always new bugs coming in, and those bugs need to be clarified, confirmed, and routed to the right people before process of getting them fixed can even begin.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIf you are interested in helping with this important part of the project, here are a few ways you can get started. Everything listed here except the parts in italics and the \"Categorizing bugs\" section is something anyone can jump in and start doing. Once you have been triaging for a while, you may want to consider \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/get-bug-editing-privileges\"\u003egetting permissions to edit bugs\u003c/a\u003e so that you can do even more.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;font-size:20px;font-weight:bold\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;font-size:20px;font-weight:bold\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Finding-duplicates\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eFinding duplicates\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Clarifying-and-or-reproducing-bugs\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eClarifying and/or reproducing bugs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cleaning-up-old-bugs\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eCleaning up old bugs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Creating-reduced-test-cases\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eCreating reduced test cases\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Categorizing-bugs\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eCategorizing bugs\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Finding-duplicates\" /\u003eFinding duplicates\u003c/h2\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eMany of the bugs that are filed are duplicates of existing bugs. Look through the \u003c/span\u003e\u003c/span\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dstatus:unconfirmed\u0026amp;sort\u003d-id\u0026amp;colspec\u003dID%20Stars%20Area%20Feature%20Status%20Summary%20Modified%20OS\" style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,153);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eunconfirmed bugs\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e for any that are already filed.\u003c/span\u003e\u003c/span\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs: Close the new bug as a duplicate of the existing bug. If there are several new duplicates of each other with no established bug, use the one with the most information.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can’t edit bugs, leave a comment with the number of the bug it’s a duplicate of. Be sure to say “bug 12345” or “issue 12345” instead of just the number, so the bug system will make it a link.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-family:Arial;font-style:italic\"\u003e\u003cspan style\u003d\"font-family:Times;font-style:normal\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe more you triage bugs, the more duplicates you will recognize immediately. If you suspect something might be a duplicate but aren’t sure (such as with a feature request that seems likely to have been made before), search for as many of the variants of the key words in the bug as you can think of. \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times;font-style:normal\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eBe sure to search “All issues”, not the default of “Open issues”\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times;font-style:normal\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e so that you can find WontFixed bugs and other duplicates.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Clarifying-and-or-reproducing-bugs\" /\u003eClarifying and/or reproducing bugs\u003c/h2\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eKnowing how to reproduce a bug is the first step toward fixing it. The bug template encourages people to provide steps to reproduce a bug, but sometimes the steps are missing, unclear, or just don’t work for everyone. Note that if something is clearly a feature request, rather than a bug report, you should skip this step.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eLook through the \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dstatus:unconfirmed\u0026amp;sort\u003d-id\u0026amp;colspec\u003dID%20Stars%20Area%20Feature%20Status%20Summary%20Modified%20OS\" style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,153);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eunconfirmed bugs\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e for reports that nobody has tried to reproduce.\u003c/span\u003e\u003c/span\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can reproduce the bug:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eLeave a comment saying so, and include your Chromium version and OS.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the steps were unclear, it’s helpful to leave more detailed steps.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you weren’t testing with the latest version of Chromium, try there, and see if it’s still reproducible, and add that information to your comment as well.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug is with web content, and you have access to browsers that the reporter didn’t test, try with those browsers and report your results.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs, and have tried to make sure that it’s not a duplicate, change it from Unconfirmed to Untriaged.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you feel that the steps were clear but you couldn’t reproduce the bug:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eLeave a comment saying that you couldn’t reproduce it, including your Chromium version and OS.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003eNote:\u003c/b\u003e If you are using an older version of Chromium than the reporter, you should do this only if you \u003cb\u003ecan\u003c/b\u003e reproduce it with a newer version (indicating a regression).\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you were using a different version of Chromium, and have access to the version it was reported with, try with that version.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the reporter doesn’t say what version they are using, ask for that information. If the bug is related to OS-specific code (browser chrome, plugins, etc.), ask for their OS if it’s not in the report.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf there is any other clarifying information that you think would help, ask for that.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the steps and/or results are missing or unclear, so that you can’t tell either what the bug is, or how to reproduce it:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eAsk for details. Be specific about what you need to know, as people often leave out steps without realizing it because something is obvious to them.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf it would be helpful, ask for a screenshot of the bug.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs: Add the \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-style:italic;font-weight:bold;white-space:pre-wrap;font-size:small\"\u003eNeeds-Feedback\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e label.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Cleaning-up-old-bugs\" /\u003eCleaning up old bugs\u003c/h2\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhile it’s most important to get new bugs triaged, as they are most likely to be relevant, there are also a number of old bugs that nobody has had time to follow up on. It can be helpful to go through old unconfirmed bugs to weed out the ones that aren’t relevant any more. All the advice above applies, but there are a few extra things to consider with old bugs:\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can’t reproduce the bug, ask the user if they can still reproduce the bug with a current version of Chromium.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eFor feature requests, if the request is about feature that has changed enough that the request no longer applies, add a comment saying so.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs: Close the bug as WontFix (which we use for obsolete bugs)\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug doesn’t contain enough information to be confirmed and someone has asked for clarifying information that was never provided, politely ask again for that information.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:square;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug has been waiting for information for over a month, and there has already been at least one reminder, add a comment saying that the bug is being closed due to lack of response and that a new bug should be filed with the requested information if it’s still reproducible, then close the bug as WontFix.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:square;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOtherwise, add the \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eNeeds-Feedback\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e label if it’s not already there.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Creating-reduced-test-cases\" /\u003eCreating reduced test cases\u003c/h2\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eFor bugs that are about compatibility with specific sites, creating a reduced test case is extremely helpful. If you are familiar with HTML, CSS, and/or Javascript, this is a great way to use your skills to help improve Chromium.\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eLook through the \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003darea:compat\u0026amp;sort\u003d-id\u0026amp;colspec\u003dID%20Stars%20Pri%20Area%20Feature%20Type%20Status%20Summary%20Modified%20Owner%20Mstone%20OS\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,153);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eCompat\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e bugs for issues that haven’t already been tracked down to a specific problem—the Needs-Reduction label is helpful in finding these, but it doesn’t always get added. Once you can reproduce a problem, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:47b7501e05b5377c\" class\u003d\"disabled\"\u003etry to isolate\u003c/a\u003e exactly what in the HTML/CSS/JavaScript/etc. is responsible for the failure.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cul style\u003d\"font-family:Times\"\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the problem is that the site is doing something wrong:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eExplain in detail what is causing the problem.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eSuggest that the bug reporter contact the site to let them know about the problem.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs: Add the \u003cb\u003eNeeds-\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eEvangelism\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e label.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the problem is due to a bug in Chromium:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eExplain in detail what is isn’t working right.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf possible, attach a minimal test case that demonstrates the underlying bug.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf possible, test with Safari as well to see if the bug happens there, and report your results\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf you can edit bugs: change the component field to \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eBlink\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e. If its status is Unconfirmed, change it to Untriaged.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Categorizing-bugs\" /\u003eCategorizing bugs\u003c/h2\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOnce you can \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/get-bug-editing-privileges\"\u003eedit bugs\u003c/a\u003e, giving bugs the correct labels helps them move through the triage process faster. There are a lot of labels, here are the most important for incoming bugs:\u003c/span\u003e\u003c/span\u003e\u003cul\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug has no Components, please assign it to a bucket:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBlink \u003d\u003d Web Content\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eInternals \u003d\u003d Internals (Network stack, plugins, etc...)\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePlatform \u003d\u003d Chrome's Developer Platform and Tools (Ext, AppsV2, NaCl, DevTools)\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eUI\u0026gt;Shell \u003d\u003d ChromeOS Shell/ Window Manager\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eUI\u0026gt;Browser \u003d\u003d Browser\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eOS\u0026gt;Hardware\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eOS\u0026gt;Kernel\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;list-style-type:square;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eOS\u0026gt;Systems\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:circle;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug/feature is about specific web technology, \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eadd the appropriate \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eBlink\u0026gt;* sub\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e component instead.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:circle;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug is about a web site not working correctly, and hasn’t been narrowed down to a specific cause, use \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eType-Compat\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e, and add \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-size:small\"\u003e\u003cb\u003eNeeds-Reduction\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:circle;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eTry to find the best match; if it’s borderline, use your best guess.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug is about a crash or hang, add the \u003cb\u003eStability-\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eCrash\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e or \u003cb\u003eStability-Hang\u003c/b\u003e label.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug is about a language translation, add the \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003eUI\u0026gt;Localization\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e component.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:Arial;list-style-type:disc;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf the bug is in an area that tends to be OS-specific (browser chrome, plugins), and the report includes the OS (or you can tell from a screenshot), add the appropriate \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOS-*\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e label. If there’s no reason to believe the bug is OS-specific, or if it’s a feature request, it’s best \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003enot\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e to add an OS label.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eMost of the remaining labels are very specialized, and it’s best not to use them unless you know otherwise. Never add or change \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eReleaseBlock-*\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e or \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eMilestone-*\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e labels.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2547469806500607582"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/getting-involved/bug-triage"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2662907783660237508"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2662907783660237508"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2662907783660237508"}],"author":[{"name":{"$t":"Stuart Morgan"},"email":{"$t":"stuartmorgan@chromium.org"}}],"sites$pageName":{"$t":"bug-triage"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8468463690733929826"},"published":{"$t":"2013-01-17T02:55:49.557Z"},"updated":{"$t":"2018-08-26T16:20:36.139Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-26T16:20:34.335Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Crash Reporting (Chrome OS System)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cul\u003e\u003cli\u003eThe main docs now exist in markdown:\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/\"\u003ehttps://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThere's a Chrome OS \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/crash-reporting/faq\" style\u003d\"font-size:10pt;background-color:transparent\"\u003eCrash Reporting FAQ\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eGetting \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/crash-reporting/stack-traces-from-chrome-os-crash-dumps\"\u003eStack Traces\u003c/a\u003e from crash reports.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eThere's also documentation on how to \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/crash-reporting/debugging-a-minidump\" style\u003d\"font-size:10pt;background-color:transparent\"\u003eDebug a Minidump\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7575192847733958161"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/packages/crash-reporting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8468463690733929826"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8468463690733929826"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8468463690733929826"}],"author":[{"name":{"$t":"Michael Krebs"},"email":{"$t":"mkrebs@chromium.org"}}],"sites$pageName":{"$t":"crash-reporting"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5015230155387046393"},"published":{"$t":"2010-07-22T23:31:47.812Z"},"updated":{"$t":"2018-08-22T01:29:36.477Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-22T01:29:34.330Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Running a Chromium OS image under KVM"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\" /\u003e\u003cp\u003eNo headings.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/cros_vm.md\" style\u003d\"background-color:transparent;font-size:13.3333px\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/cros_vm.md\u003c/a\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/running-chromeos-image-under-virtual-machines"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5015230155387046393"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5015230155387046393"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5015230155387046393"}],"author":[{"name":{"$t":"Zelidrag Hornung"},"email":{"$t":"zelidrag@chromium.org"}}],"sites$pageName":{"$t":"running-chromeos-image-under-virtual-machines"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1530250174791976002"},"published":{"$t":"2008-08-29T15:53:46.666Z"},"updated":{"$t":"2018-08-17T19:57:46.343Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-10-11T02:24:30.765Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multi-process Resource Loading"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-This-design-doc-needs-update.-Some-figures-contains-stale-information.\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eThis design doc needs update. Some figures contains stale information.\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Background\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBackground\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Blink\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eBlink\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Renderer\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eRenderer\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Browser\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eBrowser\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cookies\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eCookies\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \u003ch2\u003e\u003ca name\u003d\"TOC-This-design-doc-needs-update.-Some-figures-contains-stale-information.\" /\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont color\u003d\"#ff0000\"\u003eThis design doc needs update. Some figures contains stale information.\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\r\n\u003cp\u003eAll network communication is handled by the main browser process. This is done not only so that the browser process can control each renderer's access to the network, but also so that we can maintain consistent session state across processes like cookies and cached data. It is also important because as a HTTP/1.1 user-agent, the browser as a whole should not open too many connections per host.\u003c/p\u003e\u003col\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\r\n\u003cp\u003eOur \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture\"\u003emulti-process\u003c/a\u003e application can be viewed in three layers. At the lowest layer is the Blink engine which renders pages. Above that are the renderer process (simplistically, one-per-tab), each of which contains one Blink instance. Managing all the renderers is the browser process, which controls all network accesses.\u003c/p\u003e\r\n\r\n\u003cdiv style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-resource-loading/Resource-loading.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\"\u003e\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197833456/developers/design-documents/multi-process-resource-loading/Resource-loading.png\" style\u003d\"border-width:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Blink\" /\u003eBlink\u003c/h2\u003e\r\n\u003cp\u003eBlink has a \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceLoader\u003c/code\u003e object which is responsible for fetching data. Each loader has a \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eWebURLLoader\u003c/code\u003e for performing the actual requests. The header file for this interface is inside the Blink repo.\u003c/p\u003e\r\n\u003cp\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceLoader\u003c/code\u003e implements the interface \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eWebURLLoaderClient\u003c/code\u003e. This is the callback interface used by the renderer to dispatch data and other events to Blink.\u003c/p\u003e\r\n\u003cp\u003eThe test shell uses a different resource loader, so provides a different implementation, non-IPC version\u003cstrike\u003e of \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceLoaderBridge\u003c/code\u003e, located in \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ewebkit/tools/test_shell/simple_resource_loader_bridge\u003c/code\u003e\u003c/strike\u003e.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Renderer\" /\u003eRenderer\u003c/h2\u003e\r\n\u003cp\u003eThe renderer's implementation of \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eWebURLLoader\u003c/code\u003e, called \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eWebURLLoaderImpl\u003c/code\u003e, is located in \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003econtent/child/\u003c/code\u003e. It uses the global \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceDispatcher\u003c/code\u003e singleton object (one for each renderer process) to create a unique request ID and forward the request to the browser via IPC. Responses from the browser will reference this request ID, which can then be converted back to the \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eRequestPeer\u003c/code\u003e object (WebURLRequestImpl) by the resource dispatcher.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Browser\" /\u003eBrowser\u003c/h2\u003e\r\n\u003cp\u003eThe \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eRenderProcessHost\u003c/code\u003e objects inside the browser receive the IPC requests from each renderer. It forwards these requests to the global \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceDispatcherHost\u003c/code\u003e, using a pointer to the render process host (specifically, an implementation of \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceDispatcherHost::Receiver\u003c/code\u003e) and the request ID generated by the renderer to uniquely identify the request.\u003c/p\u003e\r\n\u003cp\u003eEach request is then converted into a \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eURLRequest\u003c/code\u003e object, which in turn forwards it to its internal \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eURLRequestJob\u003c/code\u003e that implements the specific protocol desired. When the \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eURLRequest\u003c/code\u003e generates notifications, its \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eResourceDispatcherHost::Receiver\u003c/code\u003e and request ID are used to send the notification to the correct \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eRenderProcessHost\u003c/code\u003e for sending back to the renderer. Since the ID generated by the renderer is preserved, it is able to correlate all responses with a specific request first generated by Blink.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Cookies\" /\u003eCookies\u003c/h2\u003e\r\n\u003cp\u003eAll cookies are handled by our \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eCookieMonster\u003c/code\u003e object in \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e/net/base\u003c/code\u003e. We do not share cookies with other browsers' network stacks (e.g. WinINET or Necko). The cookie monster lives in the browser process which handles all network requests because cookies need to be the same across all tabs.\u003c/p\u003e\r\n\u003cp\u003ePages can request cookies for a document via \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003edocument.cookie\u003c/code\u003e. When this occurs, we send a synchronous message from the renderer to the browser requesting the cookie. While the browser is processing the cookie, the thread that Blink works on is suspended. When the renderer's I/O thread receives the response from the browser, it un-suspends the thread and passes the result back to the JavaScript engine.\u003c/p\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-resource-loading"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1530250174791976002"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1530250174791976002"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1530250174791976002"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"multi-process-resource-loading"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/858469442362433565"},"published":{"$t":"2012-08-08T23:25:36.328Z"},"updated":{"$t":"2018-08-14T20:47:30.713Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-14T20:47:29.476Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How to specify command line flags"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page has been merged into the more complete:\u003cdiv\u003e \r\n\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/run-chromium-with-flags\"\u003ehttps://sites.google.com/a/chromium.org/dev/developers/how-tos/run-chromium-with-flags\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3087306851372487833"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/for-testers/command-line-flags"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/858469442362433565"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/858469442362433565"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/858469442362433565"}],"author":[{"name":{"$t":"Ricardo Vargas"},"email":{"$t":"rvargas@chromium.org"}}],"sites$pageName":{"$t":"command-line-flags"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8325235752178607781"},"published":{"$t":"2018-08-13T20:00:38.906Z"},"updated":{"$t":"2018-08-13T20:08:35.530Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-13T20:08:35.530Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Type C on rk3399 Chromebooks"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/type-c-on-rk3399-chromebooks/Type%20C%20on%20a%20Chromebook.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1534190915508/chromium-os/type-c-on-rk3399-chromebooks/Type%20C%20on%20a%20Chromebook.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/type-c-on-rk3399-chromebooks"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8325235752178607781"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8325235752178607781"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8325235752178607781"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$pageName":{"$t":"type-c-on-rk3399-chromebooks"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1984300073343171495"},"published":{"$t":"2018-08-13T20:02:40.666Z"},"updated":{"$t":"2018-08-13T20:08:35.508Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-13T20:02:40.666Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Type C on a Chromebook.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1984300073343171495"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8325235752178607781"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/type-c-on-rk3399-chromebooks/Type%20C%20on%20a%20Chromebook.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1984300073343171495"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1984300073343171495"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1984300073343171495"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1984300073343171495"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8741005885152914658"},"published":{"$t":"2018-08-13T20:03:31.056Z"},"updated":{"$t":"2018-08-13T20:08:35.508Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-08-13T20:03:31.056Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Type C on a Chromebook.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8741005885152914658"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8325235752178607781"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/type-c-on-rk3399-chromebooks/Type%20C%20on%20a%20Chromebook.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8741005885152914658"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8741005885152914658"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8741005885152914658"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8741005885152914658"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1435735528477792232"},"published":{"$t":"2015-12-19T00:44:08.538Z"},"updated":{"$t":"2018-08-13T20:04:30.837Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2017-01-10T18:18:47.461Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"USB Type-C Cable and Adapter Tips and Tricks"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003eThis page provides reference information for manufacturers of USB-C parts. It\r\naddresses common misunderstandings and errors in building legacy cables\r\n(Type-A or microB to USB-C) and power adapters. For complete specifications,\r\ntolerances and application rules, see the latest version of the \u003ca href\u003d\"http://www.usb.org/developers/docs/\" rel\u003d\"nofollow\"\u003eUSB Type-C specification\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Legacy-Cables\" /\u003eLegacy Cables\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eThe following table describes the type of resistor and configuration (pull-up\r\nor pull-down) that is required for each type of legacy cable. All cables must\r\nbe capable of supporting 3A, regardless of Rp/Rd.\u003c/p\u003e\r\n\u003ctable border\u003d\"1\"\u003e\r\n \r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003eResistor Rp (pull-up between VBUS and CC)\u003c/strong\u003e\u003c/td\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003eResistor Rd (pull-down between CC and GND)\u003c/strong\u003e\u003c/td\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003eID Pin\u003c/strong\u003e\u003c/td\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003eUSB-C Spec Section\u003c/strong\u003e\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB Type-C plug to USB 3.1 Type-A plug\u003c/td\u003e\r\n \r\n\u003ctd\u003e56 kΩ Rp\u003c/td\u003e\r\n \r\n\u003ctd\u003eOpen\u003c/td\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003eSection 3.5.1\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB-C plug to USB 2.0 Type-A plug\u003c/td\u003e\r\n \r\n\u003ctd\u003e56 kΩ Rp\u003c/td\u003e\r\n \r\n\u003ctd\u003eOpen\u003c/td\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003eSection 3.5.2\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB-C plug to Type-A receptacle\u003c/td\u003e\r\n \r\n\u003ctd\u003eOpen\u003c/td\u003e\r\n \r\n\u003ctd\u003e5.1 kΩ Rd\u003c/td\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003eSection 3.6.1\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB-C receptacle to microB plug\u003c/td\u003e\r\n \r\n\u003ctd\u003eNot allowed per the spec\u003c/td\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003eSection 2.2\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB-C plug to microB plug\u003c/td\u003e\r\n \r\n\u003ctd\u003eOpen\u003c/td\u003e\r\n \r\n\u003ctd\u003e5.1 kΩ Rd\u003c/td\u003e\r\n \r\n\u003ctd\u003eunconnected\u003c/td\u003e\r\n \r\n\u003ctd\u003eSection 3.5.7\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003eUSB-C plug to microB receptacle\u003c/td\u003e\r\n \r\n\u003ctd\u003e56 kΩ Rp\u003c/td\u003e\r\n \r\n\u003ctd\u003eOpen\u003c/td\u003e\r\n \r\n\u003ctd\u003eunconnected\u003c/td\u003e\r\n \r\n\u003ctd\u003eSection 3.6.2\u003c/td\u003e\r\n \u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Cable-FAQ\" /\u003eCable FAQ\u003c/h3\u003e\r\n\r\n\r\n\u003cul\u003e\r\n \u003cli\u003e \u003cstrong\u003eMy legacy cable conforms to the specification and is rated for 3A. Can I use\r\nthe Rp 3A resistor?\u003c/strong\u003e \u003c/li\u003e\u003cul\u003e\u003cli\u003eNo. You must use the 56 kΩ Rp. The resistor indicates the capability of the\r\npower adapter, not the capability of the cable. It is not safe to use the 3A\r\nRp: if the power adapter is not capable of providing 3A it could overheat.\r\n \u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e \u003cstrong\u003eWhy does my cable need to be rated for 3A if only the standard Rp is used?\u003c/strong\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eThe standard Rp indicates that the power sink needs to use some other method\r\nof finding what current the power source can provide. This method could be\r\nBC1.2 or a proprietary discovery scheme (such as the voltage set on D+/D-).\r\nUsing these methods, a sink could discover the source is capable of up to 3A. \u003cem\u003eAll cables must be capable of supporting 3A.\u003c/em\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Power-Adapters\" /\u003ePower Adapters\u003c/h2\u003e\r\n\r\n\r\n\u003cp\u003eFor USB-C power adapters, the following table specifies the resistor type and\r\nconfiguration.\u003c/p\u003e\r\n\u003ctable border\u003d\"1\"\u003e\r\n \r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n \r\n\u003ctd /\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003ePull-up on CC1\u003c/strong\u003e\u003c/td\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003ePull-up on CC2\u003c/strong\u003e\u003c/td\u003e\r\n \r\n\u003ctd\u003e\u003cstrong\u003eV\u003csub\u003eBUS\u003c/sub\u003e\u003c/strong\u003e\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003e5V 3A power adapter with USB-C receptacle\u003c/td\u003e\r\n \r\n\u003ctd\u003e10 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003e10 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003eCold\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003e5V 1.5A power adapter with USB-C receptacle\u003c/td\u003e\r\n \r\n\u003ctd\u003e22 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003e22 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003eCold\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003e5V 3A power adapter with captive USB-C cable\u003c/td\u003e\r\n \r\n\u003ctd\u003e10 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003eopen\u003c/td\u003e\r\n \r\n\u003ctd\u003eCold or Hot\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \r\n\u003ctr\u003e\r\n \r\n\u003ctd\u003e5V 1.5A power adapter with captive USB-C cable\u003c/td\u003e\r\n \r\n\u003ctd\u003e22 kΩ\u003c/td\u003e\r\n \r\n\u003ctd\u003eopen\u003c/td\u003e\r\n \r\n\u003ctd\u003eCold or Hot\u003c/td\u003e\r\n \u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eV\u003c/span\u003e\u003cspan style\u003d\"font-size:7.999999999999999px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e Cold : When nothing is attached to the USB-C receptacle or plug, V\u003c/span\u003e\u003cspan style\u003d\"font-size:7.999999999999999px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e must be 0V or vSafe0V. 5V shall be applied to V\u003c/span\u003e\u003cspan style\u003d\"font-size:7.999999999999999px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e only when a UFP is detected by monitoring voltage on the CC pin. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:13.3333px;white-space:pre-wrap\"\u003e5V should only be applied when voltage vRd on CC is 0.85V \u0026lt; vRd \u0026lt; 2.45V for a 3A power source. Please see Tables 4-23, 4-24, and 4-25 of the Type-C specification for the appropriate values of vRd \u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eminimum and maximum voltages for Default USB Power, 1.5A, and 3.0A levels\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:13.3333px;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eV\u003c/span\u003e\u003cspan style\u003d\"font-size:7.999999999999999px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e Hot : When nothing is attached to the USB-C plug, 5V may be applied to V\u003c/span\u003e\u003cspan style\u003d\"font-size:7.999999999999999px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.333333333333332px;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImportant Note : If your charger implements USB Power Delivery, regardless of connector type (Receptacle or captive cable), V\u003c/span\u003e\u003cspan style\u003d\"font-size:8px;font-family:Arial;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Cold is required.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-USB-Battery-Charging-v1.2\" /\u003eUSB Battery Charging v1.2\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eFor chargers with a USB-C receptacle, it is highly recommended the port also support USB Battery Charging v1.2 in order to allow legacy devices using Type-A plugs or Micro-B receptacles to charge.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo implement a BC1.2 Dedicated Charging Port (DCP), D+ and D- lines in the receptacle must be shorted together.  Please see the \u003ca href\u003d\"http://www.usb.org/developers/docs/devclass_docs/BCv1.2_070312.zip\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eUSB Battery Charging v1.2 Spec\u003c/a\u003e for more details on how to implement DCP or CDP.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-USB-PD-Power-Rules\" /\u003eUSB PD Power Rules\u003c/h3\u003e\r\n\r\n\r\n\u003cp\u003ePower adapters with maximum power \u0026lt;\u003d 15W may support USB Power Delivery. Power\r\nadapters with maximum power \u0026gt; 15W must support USB Power Delivery. When\r\ninitially specifying the voltage and current capability of an adapter which\r\nsupplies \u0026gt; 15W, pay close attention to Power Rules, in USB PD R2.0 V1.2 Section\r\n10.\u003c/p\u003e\r\n\r\n\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/cable-and-adapter-tips-and-tricks/SourcePowerRule.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1464830406082/chromium-os/cable-and-adapter-tips-and-tricks/SourcePowerRule.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eUSB PD Revision 2.0 specifies normative voltage rails of 5V, 9V, 15V, and 20V. In order\r\nto support a particular voltage rail, all voltage rails lower must be supported\r\nup to 3A.\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Power-Adapter-FAQ\" /\u003ePower Adapter FAQ\u003c/h3\u003e\r\n\r\n\r\n\u003cul\u003e\r\n \u003cli\u003e \u003cstrong\u003eIn a 5V 3A or 5V 1.5A supply can I connect CC1 and CC2 and use a single shared\r\nresistor? \u003c/strong\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eNo. This design fails with active cables, emarked cables or any device that\r\nrequests Vconn. These cables have an Ra pulldown on one of the pins, preventing\r\naccurate detection of CC voltage if the pins are shorted at the adapter.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb\u003eMay a Type-C charger support a proprietary method of changing V\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:8px;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:13.3333px;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/b\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:13.3333px;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003ein addition to or instead of USB Power Delivery? (For example, Qualcomm QuickCharge, MediaTek PumpExpress, others)\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo. Section 4.8.2 of the USB Type-C Specification explicitly forbids proprietary methods that change V\u003c/span\u003e\u003cspan style\u003d\"font-size:8px;font-family:Arial;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003eBUS\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e from the default voltage defined by USB 2.0 and USB 3.1 specifications (maximum 5.5V). This applies to both power sources and power sinks. If the power adapter incorporates a Type-C plug or a Type-C receptacle, that connector must not support any dynamic voltage method other than USB Power Delivery.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/cable-and-adapter-tips-and-tricks"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1435735528477792232"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1435735528477792232"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1435735528477792232"}],"author":[{}],"sites$pageName":{"$t":"cable-and-adapter-tips-and-tricks"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2748135864292926464"},"published":{"$t":"2013-04-26T19:46:24.804Z"},"updated":{"$t":"2018-07-30T05:28:48.695Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2017-10-10T13:56:22.999Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Deprecating Features"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-To-Measure-Usage-and-Notify-Developers\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eHow To Measure Usage and Notify Developers\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-To-Measure-Usage-and-Notify-Developers\" /\u003eHow To Measure Usage and Notify Developers\u003c/h2\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eAdd your feature to \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/public/platform/web_feature.mojom?q\u003dthird_party/WebKit/public/platform/web_feature.mojom\u0026amp;sq\u003dpackage:chromium\u0026amp;dr\u0026amp;l\u003d16\" target\u003d\"_blank\"\u003eweb_feature.mojom's WebFeature\u003c/a\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eAdd a clever deprecation message to the big switch in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/Source/core/frame/Deprecation.cpp?type\u003dcs\u0026amp;q\u003dDeprecation::DeprecationMessage%5C(\u0026amp;l\u003d295\" target\u003d\"_blank\"\u003eUseCounter::deprecationMessage\u003c/a\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eInstrument your code by:\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAdding \u003ccode\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/WebKit/Source/bindings/IDLExtendedAttributes.md#DeprecateAs_m_a_c\" target\u003d\"_blank\"\u003eDeprecateAs\u003c/a\u003e\u003d[your enum value here]\u003c/code\u003e to the fea\u003c/font\u003eture's IDL definition (see \u003ca href\u003d\"https://cs.chromium.org/search/?q\u003dDeprecateAs+file:%5Esrc/third_party/WebKit/Source/modules/+package:%5Echromium$\u0026amp;type\u003dcs\" target\u003d\"_blank\"\u003ethese examples\u003c/a\u003e).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eAdding a call to \u003ccode\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/Source/core/frame/Deprecation.h?type\u003dcs\u0026amp;l\u003d43\" target\u003d\"_blank\"\u003eDeprecation::CountDeprecation\u003c/a\u003e\u003c/code\u003e somewhere relevant (as we're dong for the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp?type\u003dcs\u0026amp;q\u003dDeprecation::CountDeprecation%5C(document-%3EGetFrame%5C(%5C),\u0026amp;l\u003d422\" target\u003d\"_blank\"\u003eUserMediaRequest\u003c/a\u003e).\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eNote that \u003ccode\u003eDeprecateAs\u003c/code\u003e is intended to replace \u003ccode\u003eMeasureAs\u003c/code\u003e in the IDL file. Specifying both is redundant.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2023764670965291136"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/deprecating-features"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2748135864292926464"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2748135864292926464"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2748135864292926464"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$pageName":{"$t":"deprecating-features"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"Wil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3966777660170060486"},"published":{"$t":"2010-04-23T14:30:58.149Z"},"updated":{"$t":"2018-07-23T03:47:41.766Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-03T20:32:40.077Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cellular modem FAQ"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-verify-that-a-modem-is-seen-by-Modem-Manager-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eHow do I verify that a modem is seen by Modem Manager?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-if-the-modem-is-not-seen-by-Modem-Manager-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eWhat if the modem is not seen by Modem Manager?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-get-more-information-about-a-modem-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eHow do I get more information about a modem?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-manually-connect-a-modem-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eHow do I manually connect a modem?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-fix-flimflam-to-recognize-my-GSM-carrier-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eHow do I fix flimflam to recognize my GSM carrier?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-manually-connect-via-flimflam-\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eHow do I manually connect via flimflam?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-debug-the-Gobi-kernel-module-\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eHow do I debug the Gobi kernel module?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-see-the-GPS-stream-on-a-Gobi-modem-\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eHow do I see the GPS stream on a Gobi modem?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-do-all-those-PIN-codes-do-\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eWhat do all those PIN codes do?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-run-tests-on-cell-modems-\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eHow do I run tests on cell modems?\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eChrome OS supports Gobi modems via Cromo, and various other modems via Modem Manager.  Chrome OS only supports cellular modems that have a cdc_ether (or similar) network interface.  This page documents what is useful to know if you wish to bring up new modems and/or GSM carriers.\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-verify-that-a-modem-is-seen-by-Modem-Manager-\" /\u003eHow do I verify that a modem is seen by Modem Manager?\u003c/h2\u003e\r\n\u003cdiv\u003eThere are several modem tools that are part of the flimflam-testscripts package.  This package is install on test builds.  The tools can be found in /usr/local/lib/flimflam/test.  The first step is to verify that Chrome OS can see the modem. \u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003ePATH\u003d${PATH}:/usr/local/lib/flimflam/test\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003emm-list-modems\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eYou should see something like:\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"font-family:courier new,monospace\"\u003e\u003ccode\u003e/org/freedesktop/ModemManager/Modems/0\u003cbr /\u003e\r\nor\u003cbr /\u003e\r\n/org/chromium/Cromo/Gobi/0\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-if-the-modem-is-not-seen-by-Modem-Manager-\" /\u003eWhat if the modem is not seen by Modem Manager?\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003emake sure kernel has proper drivers\u003c/li\u003e\r\n\u003cli\u003edo you need to run modem-modeswitch?\u003c/li\u003e\r\n\u003cli\u003edo you need to eject the modem?\u003c/li\u003e\r\n\u003cli\u003eCan you write some udev rules to automatically eject/modeswtich the modem?\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-get-more-information-about-a-modem-\" /\u003eHow do I get more information about a modem?\u003c/h2\u003e\r\n\u003cdiv\u003eEnable the modem and use the mm-status command to get more information about the modem.\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003emm-enable\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003emodem status\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe output will look like:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003ePath: /org/freedesktop/ModemManager/Modems/0\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eIface org.freedesktop.ModemManager.Modem\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eMasterDevice \u003d /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eUnlockRequired \u003d \u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eEnabled \u003d 1\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eIpMethod \u003d 0\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eDriver \u003d option1\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eDevice \u003d ttyUSB0\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eType \u003d 2\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eGetInfo()\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e---------\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eManufacturer: NOVATEL WIRELESS INCORPORATED\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eModem: MC760 SPRINT\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eVersion: Q6085BDRAGONFLY_S122  [Dec 09 2008 18:00:00]\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eGetEsn()\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e--------\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eesn \u003d 0x5B96D0FB\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eGetRegistrationState()\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e----------------------\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eCDMA-1x state: 1\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eEVDO state: 1\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eGetServingSystem()\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e------------------\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eServing System band class: 2\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eServing System band: B\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eServing System id: 4106\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eGetSignalQuality()\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e--------------\u003c/code\u003e\u003ccode\u003e----\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eSignal Quality: 100\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-manually-connect-a-modem-\" /\u003eHow do I manually connect a modem?\u003c/h2\u003e\r\n\u003cdiv\u003eYou can use the mm-connect script to manually connect a modem to a 3G network.  If you are using a GSM network you may need to edit mm-connect to add your carrier (APN, number, pin) to the dictionary of connect arguments.  Connecting a modem though in most cases only establishes a PDP context between the modem and the carrier.    You'll then need to run dhclient on the associated interface. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-fix-flimflam-to-recognize-my-GSM-carrier-\" /\u003eHow do I fix flimflam to recognize my GSM carrier?\u003c/h2\u003e\r\n\u003cdiv\u003eFlimflam uses the mobile-broadband-provider-info to find APNs.  You can enter your own APN on the UI, or if you find that your APN is missing from the monbile broadband provider info database, file a but at https://bugzilla.gnome.org/\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-manually-connect-via-flimflam-\" /\u003eHow do I manually connect via flimflam?\u003c/h2\u003e\r\n\u003cdiv\u003eThe advantage of using flimflam to connect is that you flimflam will take care of running dhcpcd for you.  Using the flimflam scripts one can list the devices, and services.  You should be able to verify that a cellular device is listed, and that there is a cellular service. To ask flimflam to connect via the cellular service issues the connect-service command (from /usr/local/lib/flimflam/test):\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003elist-devices\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003econnect-service cell\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThere are still some issues in the support of the cdc_ether driver.  If the connect-service call fails, try to disconnect, and reissue the connect call.  In most cases this will succeed in connecting your 3G modem.\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003edisconnect-service cell\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003econnect-service cell\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-debug-the-Gobi-kernel-module-\" /\u003eHow do I debug the Gobi kernel module?\u003c/h2\u003e\u003cdiv\u003eTo debug the Gobi kernel module, you need to set the gobi_debug module parameter on the gobi module.  There are two ways to do this:\u003c/div\u003e\u003cbr /\u003eTo set the parameter temporarily (until the module is unloaded, such as when you reboot), you can use sysfs:\u003cdiv\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003elocalhost ~ # echo 1 \u0026gt; /sys/module/gobi/parameters/gobi_debug\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eTo set the parameter permanently, you can configure modprobe to set it automatically:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003elocalhost ~ # echo 'options gobi gobi_debug\u003d1' \u0026gt; /etc/modprobe.d/gobi_debug.conf\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou can use either 1 or 2 for the debug level.  1 will show most userspace-relevant error conditions, but won't trace most normal behavior; 2 will dump every control packet to and from the card, and will give more detail about normal behavior.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-see-the-GPS-stream-on-a-Gobi-modem-\" /\u003e\r\nHow do I see the GPS stream on a Gobi modem?\u003c/h2\u003e\r\n\u003cdiv\u003eTo see the GPS stream on a Gobi modem you first have to enable automatic tracking.\u003cbr /\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e   \u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e localhost ~ # echo -e -n '$GPS_START' \u0026gt; /dev/ttyUSB2\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    localhost ~ # dbus-send --system --print-reply \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     --dest\u003dorg.chromium.ModemManager \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     /org/chromium/ModemManager/Gobi/0 \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     org.chromium.ModemManager.Modem.Gobi.SetAutomaticTracking \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     boolean:true boolean:true\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003elocalhost ~ # cat /dev/ttyUSB2\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv\u003e    \u003c/div\u003e\r\n\u003cdiv\u003e and observe the NMEA stream printed on the console. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThen interrupt the stream (^c), and enter\u003c/div\u003e\r\n\u003cdiv\u003e    \u003c/div\u003e\r\n\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003elocalhost ~ # dbus-send --system --print-reply \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     --dest\u003dorg.chromium.ModemManager \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     /org/chromium/ModemManager/Gobi/0 \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     org.chromium.ModemManager.Modem.Gobi.SetAutomaticTracking \\\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     boolean:false boolean:false\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003elocalhost ~ # cat /dev/ttyUSB2\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv\u003e    \u003c/div\u003e\r\n\u003cdiv\u003eand observe that the stream has been stopped.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif\"\u003eNote that we have an autotest which does all that, it should be invoked as follows:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./run_remote_tests.sh --board\u003d\u0026lt;board\u0026gt; --remote\u003d\u0026lt;taregt ip\u0026gt; hardware_GPS/control\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-do-all-those-PIN-codes-do-\" /\u003eWhat do all those PIN codes do?\u003c/h2\u003e\u003cdiv\u003eThere are 8 different kinds of standard PIN codes defined for GSM devices. Two of these apply to the SIM card, and the others apply to the device itself. The following table describes each kind of PIN. Most PINs allow some number of incorrect entries, after which the PIN becomes \"blocked\". At that point the PIN must be \"unblocked\" by entering a PUK code. Each PIN type has its own corresponding type of PUK.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSIM locks can be disabled, which is different than unlocking. Unlocking only lasts until the next power cycle. Disabling prevents the SIM from being locked, even following a power cycle. To disable a SIM lock, the SIM PIN must be supplied.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eDevice locks, also known as personalization locks, restrict usage of the device, as described below. For personalization, there is no distinction between unlocking and disabling. For each type of personalization, there is a code that must be entered. If the correct code is entered, the corresponding device restriction is lifted.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRefer to 3GPP spec \u003ca href\u003d\"http://www.etsi.org/deliver/etsi_ts/122000_122099/122022/10.00.00_60/ts_122022v100000p.pdf\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eTS 22.022\u003c/a\u003e for full details.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/get-a-3g-modem-running/GSM%20PIN%20code%20types.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1315928650519/chromium-os/how-tos-and-troubleshooting/get-a-3g-modem-running/GSM%20PIN%20code%20types.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-do-I-run-tests-on-cell-modems-\" /\u003eHow do I run tests on cell modems?\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eYou can run autotests against a live carrier network, or you can use an emulated-network testbed.   See  \u003ca href\u003d\"https://docs.google.com/a/google.com/document/pub?id\u003d1FTSAO-5hVTAV9t7RNZWJRN_QOOqpl5qZJua4k3POwKc\" target\u003d\"_blank\"\u003eRunning and Writing Autotests for Cell Emulators\u003c/a\u003e and \u003ca href\u003d\"https://docs.google.com/a/google.com/document/pub?id\u003d1yG7j8Iw9PnQTH-93zP5BqB0qQRU08az11A_eN0acd70\" target\u003d\"_blank\"\u003eChrome OS Cellular Testbed Setup\u003c/a\u003e.\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/get-a-3g-modem-running"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3966777660170060486"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3966777660170060486"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3966777660170060486"}],"author":[{}],"sites$pageName":{"$t":"get-a-3g-modem-running"},"sites$revision":{"$t":"23"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6048018506533103059"},"published":{"$t":"2018-07-20T16:56:59.875Z"},"updated":{"$t":"2018-07-20T16:58:24.249Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-20T16:58:21.018Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome OS Performance Philosophy"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Speed-is-core-to-Chrome-OS-as-it-is-to-Chrome.-Speed-is-one-of-the-most-compelling-features-of-Chrome-OS---we-get-out-of-the-way-as-quickly-as-possible-so-users-can-be-productive-and-enjoy-their-content.-Beyond-Chrome-s-commitment-to-make-the-fastest-brows\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSpeed is core to Chrome OS, as it is to \u003ca href\u003d\"https://www.chromium.org/developers/core-principles\" style\u003d\"background-color:transparent;font-weight:normal\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:normal;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:normal;font-size:11pt;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e Speed is one of the most compelling features of Chrome OS - we get out of the way as quickly as possible so users can be productive and enjoy their content.  Beyond Chrome’s commitment to make the fastest browser, Chrome OS pays attention to the speed of all user interactions, ranging from I/O devices like the keyboard and screen, to connectivity components such as WiFi.\u003c/span\u003e\u003c/h2\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe measure the speed of user interactions along various dimensions, with the goal that Chromebooks should always feel responsive. We ask ourselves questions like:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eHow long does it take to boot the device? \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eHow quickly do websites load? \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAre the graphics smooth when browsing the web or playing games?\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDoes the screen behave correctly when the device changes modes?\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDo performance improvements in Chrome manifest in Chrome OS?\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe collect these metrics for all Chromebooks over their entire supported lifecycle to ensure the user experience does not deteriorate. Every year, we review our performance targets and we often raise our bar. Many of our devices actually get faster over time, even as we add new features like Android apps.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chrome-os-performance-overview"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6048018506533103059"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6048018506533103059"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6048018506533103059"}],"author":[{"name":{"$t":"Dan McClary"},"email":{"$t":"dwmclary@chromium.org"}}],"sites$pageName":{"$t":"chrome-os-performance-overview"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7464329363076840963"},"published":{"$t":"2018-07-06T21:37:57.012Z"},"updated":{"$t":"2018-07-14T00:11:40.045Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-14T00:11:40.045Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7464329363076840963"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7464329363076840963"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7464329363076840963"}],"author":[{"name":{"$t":"Saurabh Madan"},"email":{"$t":"ssmadan@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-30"},{"index":"B","name":"OEM","$t":"\u003cwhite label\u003e"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"\"\u003e\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"blacktip"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R67"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4650853976828356591"},"published":{"$t":"2018-06-08T04:35:57.262Z"},"updated":{"$t":"2018-07-12T22:31:15.034Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:31:15.033Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4650853976828356591"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4650853976828356591"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4650853976828356591"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-01"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eHP Chromebook x2\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Soraka"},{"index":"E","name":"Board name(s)","$t":"soraka"},{"index":"F","name":"Base board","$t":"poppy"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-Y"},{"index":"K","name":"Form Factor","$t":"Chromeblet"},{"index":"L","name":"First Release","$t":""},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":"Left Port"},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1703507770105610332"},"published":{"$t":"2017-11-14T16:07:30.267Z"},"updated":{"$t":"2018-07-12T22:30:59.024Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:30:59.024Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1703507770105610332"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1703507770105610332"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1703507770105610332"}],"author":[{"name":{"$t":"Duncan Laurie"},"email":{"$t":"dlaurie@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Release","$t":"2017-10-31"},{"index":"B","name":"OEM","$t":"Google"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003ePixelbook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Eve"},{"index":"E","name":"Board name(s)","$t":"eve"},{"index":"F","name":"Base board","$t":"eve"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-Y"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R61"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":"Left Port"},{"index":"O","name":"Closed Case Debugging","$t":"Left Port"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7936985274466754000"},"published":{"$t":"2018-06-08T04:36:42.047Z"},"updated":{"$t":"2018-07-12T22:28:14.375Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:28:14.375Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7936985274466754000"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7936985274466754000"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7936985274466754000"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-01"},{"index":"B","name":"OEM","$t":"ASUS"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eASUS Chromebox 3\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Teemo"},{"index":"E","name":"Board name(s)","$t":"fizz"},{"index":"F","name":"Base board","$t":"fizz"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":""},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8886692298219951255"},"published":{"$t":"2017-07-13T23:36:04.768Z"},"updated":{"$t":"2018-07-12T22:19:12.881Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:19:12.880Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8886692298219951255"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8886692298219951255"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8886692298219951255"}],"author":[{"name":{"$t":"Vincent Wang"},"email":{"$t":"vwang@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2017-06-30"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www.chromium.org/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebook Spin 11 R751T\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Electro"},{"index":"E","name":"Board name(s)","$t":"reef"},{"index":"F","name":"Base board","$t":"reef"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R53"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2655412106073228206"},"published":{"$t":"2018-06-08T04:37:31.080Z"},"updated":{"$t":"2018-07-12T22:18:58.675Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:18:58.674Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2655412106073228206"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2655412106073228206"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2655412106073228206"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-01"},{"index":"B","name":"OEM","$t":"Viewsonic"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eViewSonic NMP660 Chromebox\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Wukong"},{"index":"E","name":"Board name(s)","$t":"fizz"},{"index":"F","name":"Base board","$t":"fizz"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":""},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/676833525430561034"},"published":{"$t":"2018-06-08T04:33:30.460Z"},"updated":{"$t":"2018-07-12T22:18:53.903Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:18:53.902Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/676833525430561034"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/676833525430561034"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/676833525430561034"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-06-01"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eAcer Chromebox CXI3\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Sion"},{"index":"E","name":"Board name(s)","$t":"fizz"},{"index":"F","name":"Base board","$t":"fizz"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":""},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/594424226709260131"},"published":{"$t":"2018-06-08T04:30:49.037Z"},"updated":{"$t":"2018-07-12T22:18:47.945Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:18:47.945Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/594424226709260131"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/594424226709260131"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/594424226709260131"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2018-05-18"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eHP Chromebox G2\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Kench"},{"index":"E","name":"Board name(s)","$t":"fizz"},{"index":"F","name":"Base board","$t":"fizz"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"Kabylake-U/R"},{"index":"K","name":"Form Factor","$t":"Chromebox"},{"index":"L","name":"First Release","$t":""},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6446511935086660135"},"published":{"$t":"2017-08-20T19:52:08.904Z"},"updated":{"$t":"2018-07-12T22:15:50.101Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:15:50.101Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6446511935086660135"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6446511935086660135"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6446511935086660135"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2017-04-24"},{"index":"B","name":"OEM","$t":"HP"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eHP Chromebook x360 11 G1 EE\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Snappy"},{"index":"E","name":"Board name(s)","$t":"snappy"},{"index":"F","name":"Base board","$t":"reef"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R56"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4128926595872765677"},"published":{"$t":"2018-03-30T08:20:37.001Z"},"updated":{"$t":"2018-07-12T22:14:55.897Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:14:55.897Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4128926595872765677"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4128926595872765677"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4128926595872765677"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Release","$t":"2018-03-16"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.acer.com/ac/en/AU/press/2018/333192\"\u003eAcer Chromebook Spin 11 (CP311-1H \u0026amp; CP311-1HN)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Lava"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Convertible"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2989466097733194296"},"published":{"$t":"2018-03-07T07:26:22.133Z"},"updated":{"$t":"2018-07-12T22:14:51.055Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:14:51.054Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2989466097733194296"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2989466097733194296"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2989466097733194296"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"2"},"gs$field":[{"index":"A","name":"Release","$t":"2018-03-05"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.acer.com/ac/en/US/press/2018/324876\"\u003eAcerChromebook 11 (CB311-8H \u0026amp; CB311-8HT)\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Santa"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/240951938562743512"},"published":{"$t":"2018-03-07T07:36:42.411Z"},"updated":{"$t":"2018-07-12T22:14:45.889Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:14:45.889Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/240951938562743512"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/240951938562743512"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/240951938562743512"}],"author":[{"name":{"$t":"Paris Yeh"},"email":{"$t":"pyeh@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2018-02-14"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"https://www.acer.com/ac/en/US/press/2018/333129\"\u003eAcer Chromebook 11 (C732, C732T, C732L \u0026amp; C732LT )\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Astronaut"},{"index":"E","name":"Board name(s)","$t":"coral"},{"index":"F","name":"Base board","$t":"coral"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R64"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3000341943326971227"},"published":{"$t":"2017-09-12T22:03:36.083Z"},"updated":{"$t":"2018-07-12T22:13:28.274Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:13:28.274Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3000341943326971227"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3000341943326971227"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3000341943326971227"}],"author":[{"name":{"$t":"Vincent Wang"},"email":{"$t":"vwang@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Release","$t":"2017-09-08"},{"index":"B","name":"OEM","$t":"Acer"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www.chromium.org/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eChromebook 15 CB515-1HT/1H\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Sand"},{"index":"E","name":"Board name(s)","$t":"sand"},{"index":"F","name":"Base board","$t":"reef"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R59"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1429047687331234275"},"published":{"$t":"2017-08-20T19:50:48.631Z"},"updated":{"$t":"2018-07-12T22:13:24.031Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-12T22:13:24.031Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listitem","label":"listitem"}],"title":{"$t":""},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2461203149256614225"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1429047687331234275"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1429047687331234275"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1429047687331234275"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Release","$t":"2017-04-24"},{"index":"B","name":"OEM","$t":"Lenovo"},{"index":"C","name":"Model","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/generic\"\u003eLenovo Thinkpad 11e Chromebook / Lenovo Thinkpad Yoga 11e Chromebook\u003c/a\u003e"},{"index":"D","name":"Code name","$t":"Pyro"},{"index":"E","name":"Board name(s)","$t":"pyro"},{"index":"F","name":"Base board","$t":"reef"},{"index":"G","name":"User ABI","$t":"x86_64"},{"index":"H","name":"Kernel","$t":"4.4"},{"index":"I","name":"Kernel ABI","$t":"x86_64"},{"index":"J","name":"Platform","$t":"ApolloLake"},{"index":"K","name":"Form Factor","$t":"Chromebook"},{"index":"L","name":"First Release","$t":"R56"},{"index":"M","name":"EOL/AUE","$t":""},{"index":"N","name":"USB Gadget","$t":""},{"index":"O","name":"Closed Case Debugging","$t":"Yes"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1280314525549912823"},"published":{"$t":"2018-07-10T21:39:14.294Z"},"updated":{"$t":"2018-07-10T21:39:14.331Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-10T21:39:14.294Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"951-00273-01_20180607_suzyqable_SCH_1.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1280314525549912823"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1338468147941872365"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/ccd/951-00273-01_20180607_suzyqable_SCH_1.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1280314525549912823"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280314525549912823"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280314525549912823"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1280314525549912823"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8399672929028241347"},"published":{"$t":"2018-07-06T23:34:13.258Z"},"updated":{"$t":"2018-07-06T23:34:13.293Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-06T23:34:13.258Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"suzy-qs-1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8399672929028241347"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1338468147941872365"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/ccd/suzy-qs-1.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8399672929028241347"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8399672929028241347"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8399672929028241347"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8399672929028241347"}],"author":[{"name":{"$t":"Alexandru Stan"},"email":{"$t":"amstan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6615721171050697760"},"published":{"$t":"2011-06-14T22:39:56.938Z"},"updated":{"$t":"2018-07-03T20:40:27.381Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-03T20:40:24.233Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome Release Channels"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Channels\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eChannels\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Windows\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eWindows\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mac\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eMac\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Linux\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eLinux\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-choose-which-channel-to-use-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eHow do I choose which channel to use?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-What-should-I-do-before-I-change-my-channel-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eWhat should I do before I change my channel?\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Back-up-your-data-\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eBack up your data!\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Enable-anonymous-usage-statistics\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eEnable anonymous usage statistics\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Reporting-Dev-channel-and-Canary-build-problems\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eReporting Dev channel and Canary build problems\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Going-back-to-a-more-stable-channel\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eGoing back to a more stable channel\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n \r\n\r\nChrome supports a number of different release channels.  We use these channels to slowly roll out updates to users, starting with our close to daily Canary channel builds, all the way up to our Stable channel releases that happen every 6 weeks roughly.\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Channels\" /\u003eChannels\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Windows\" /\u003eWindows\u003c/h4\u003e\u003cdiv\u003eAll channels may be run in parallel -- they install into distinct directories and use dedicated User Data directories.\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome?platform\u003dwin\"\u003eStable channel for Windows\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome?platform\u003dwin\"\u003eBeta channel for Windows\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/eula.html?extra\u003ddevchannel\u0026amp;platform\u003dwin\"\u003eDev channel for Windows\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://tools.google.com/dlpage/chromesxs?platform\u003dwin\"\u003eCanary build for Windows\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Mac\" /\u003eMac\u003c/h4\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://google.com/chrome?platform\u003dmac\"\u003eStable channel for Mac\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://google.com/chrome?platform\u003dmac\"\u003eBeta channel for Mac\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_dev.html?dl\u003dmac\"\u003eDev channel for Mac\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://tools.google.com/dlpage/chromesxs?platform\u003dmac\"\u003eCanary build for Mac\u003c/a\u003e (Note, this will run in parallel to any other Chrome channel you have installed, it will not use the same profile)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Linux\" /\u003eLinux\u003c/h4\u003e\r\n\u003ca href\u003d\"http://www.google.com/chrome?platform\u003dlinux\"\u003eStable channel\u003c/a\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003e32-bit Ubuntu/Debian\u003c/b\u003e\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_beta.html?dl\u003dbeta_i386_deb\"\u003eBeta channel for 32-bit Debian/Ubuntu\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_dev.html?dl\u003dunstable_i386_deb\"\u003eDev channel for 32-bit Debian/Ubuntu\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cb\u003e32-bit Fedora/OpenSUSE\u003c/b\u003e\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_beta.html?dl\u003dbeta_i386_rpm\"\u003eBeta channel for 32-bit Fedora/OpenSUSE\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_dev.html?dl\u003dunstable_i386_rpm\"\u003eDev channel for 32-bit Fedora/OpenSUSE\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cb\u003e64-bit Ubuntu/Debian\u003c/b\u003e\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_beta.html?dl\u003dbeta_amd64_deb\"\u003eBeta channel for 64-bit Debian/Ubuntu\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_dev.html?dl\u003dunstable_amd64_deb\"\u003eDev channel for 64-bit Debian/Ubuntu\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cb\u003e64-bit Fedora/Red Hat/OpenSUSE\u003c/b\u003e\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_beta.html?dl\u003dbeta_amd64_rpm\"\u003eBeta channel for 64-bit Fedora/OpenSUSE\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.google.com/chrome/intl/en/eula_dev.html?dl\u003dunstable_amd64_dev\"\u003eDev channel for 64-bit Fedora/OpenSUSE\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-choose-which-channel-to-use-\" /\u003eHow do I choose which channel to use?\u003c/h3\u003e\r\nThe release channels for chrome range from the most stable and tested (Stable channel) to completely untested and likely least stable (Canary channel).  Note, you can run the Canary channel builds alongside any other channel, as they do not share profiles with other channels.  This allows you to play with our latest code, while still keeping a tested version of Chrome around.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eStable channel:\u003c/b\u003e This channel has gotten the full testing and blessing of the Chrome test team, and is the best bet to avoid crashes and other issues.  It's updated roughly every two-three weeks for minor releases, and every 6 weeks for major releases.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eBeta channel:\u003c/b\u003e If you are interested in seeing what's next, with minimal risk, Beta channel is the place to be.  It's updated every week roughly, with major updates coming ever six weeks, more than a month before the Stable channel will get them.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eDev channel:\u003c/b\u003e Want to see what's happening quickly, then you want the Dev channel.  The Dev channel gets updated once or twice weekly, and it shows what we're working on right now.  There's no lag between major versions, whatever code we've got, you will get.  While this build does get tested, it is still subject to bugs, as we want people to see what's new as soon as possible.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eCanary build:\u003c/b\u003e Canary builds are the bleeding edge. Released daily, this build has not been tested or used, it's released as soon as it's built. Because there's no guarantee that it will even run in some cases, it uses it's own profile and settings, and can be run side by side another Chrome channel.  By default, it also reports crashes and usage statistics to Google (you can disable this on the download page).\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n\u003cb\u003eNote\u003c/b\u003e: Early access releases (Canary builds and Dev and Beta channels) will be only partly translated into languages other than English. Text related to new features may not get translated into all languages until the feature is released in the Stable channel. \r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-should-I-do-before-I-change-my-channel-\" /\u003eWhat should I do before I change my channel?\u003c/h3\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Back-up-your-data-\" /\u003eBack up your data!\u003c/h4\u003e\r\nBefore you switch, you should make a backup of your profile (bookmarks, most visited pages, history, cookies, etc). If you ever want to switch back to a more stable channel, your updated profile data might not be compatible with the older version.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\r\n Make a copy of the User Data\\Default directory (for example,\r\n copy it to 'Default Backup' in the same location). The\r\n location depends on your operating system:\r\n\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\nWindows XP:\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStable, beta, and dev channels: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Documents and Settings\\\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\\Local Settings\\Application Data\\Google\\Chrome\\User Data\\Default\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCanary builds: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Documents and Settings\\\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\\Local Settings\\Application Data\\Google\\Chrome SxS\\User Data\\Default\u003c/span\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\nWindows Vista, 7, 8 or 10:\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStable channel: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Users\\\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\\AppData\\Local\\Google\\Chrome\\User Data\\Default\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eB\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eeta channel: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Users\\\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\\AppData\\Local\\Google\\Chrome Beta\\User Data\\Default\u003c/span\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eD\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eev channel: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Users\\\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\\AppData\\Local\\Google\\Chrome Dev\\User Data\\Default \u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCanary builds: \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\Users\\\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-style:italic\"\u003e%USERNAME%\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\\AppData\\Local\\Google\\Chrome SxS\\User Data\\Default\u003c/span\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eMac OS X:\u003c/span\u003e\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStable, beta, and dev channels: \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e~/Library/Application Support/Google/Chrome/Default\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCanary builds: \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e~/Library/Application Support/Google/Chrome Canary/Default\u003c/font\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003eLinux:\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e~/.config/google-chrome/Default\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n \u003c/font\u003e\u003c/blockquote\u003e\r\n\r\nNote:\u003cb\u003e \u003c/b\u003eIf you're using Explorer to find the folder,\r\nyou might need to set \u003cb\u003eShow hidden files and folders\u003c/b\u003e in \u003cb\u003eTools\r\n\u0026gt; Folder Options... \u0026gt; View\u003c/b\u003e.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Enable-anonymous-usage-statistics\" /\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eEnable anonymous usage statistics\u003c/span\u003e\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003ePlease configure Google Chrome to send anonymous usage stats to Google. The statistics we gather have no personally\r\n identifiable information. The aggregate of all the stats for\r\n all users in a release channel really help us\r\n understand how stable the release is and how people are using\r\n any new features.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003cdiv\u003e\r\n Choose \u003cb\u003e[Wrench menu] \u0026gt; Options\u003c/b\u003e (Windows and Linux) or \u003cb\u003eChrome \u0026gt; Preferences…\u003c/b\u003e (Mac), go to the \u003cb\u003eUnder the Hood\r\n \u003c/b\u003etab, and check \u003cb\u003eHelp make Google Chrome better by\r\n automatically sending usage statistics and crash reports to\r\n Google\u003c/b\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Reporting-Dev-channel-and-Canary-build-problems\" /\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003eReporting Dev channel and Canary build problems\u003c/span\u003e\u003c/h3\u003e\r\n\r\nRemember, Dev channel browsers and Canary builds may still crash frequently.  Before reporting bugs, consult the following pages:\r\n\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines\"\u003eBug Life Cycle and Reporting Guidelines\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eSee \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidlines-for-the-mac-linux-builds\"\u003e bug-reporting-guidlines-for-the-mac-linux-builds\u003c/a\u003e before reporting problems in Mac or Linux Dev channel builds\u003c/li\u003e\r\n\u003c/ul\u003e\r\nIf after reading the above, you think you have a real bug, file it at \u003ca href\u003d\"http://crbug.com/new\" target\u003d\"_blank\"\u003ehttp://crbug.com/new\u003c/a\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Going-back-to-a-more-stable-channel\" /\u003eGoing back to a more stable channel\u003c/h3\u003e\u003cul\u003e\u003cli\u003eIf you decide to switch from Dev to Beta or from Beta to Stable, the new channel will be on an earlier version of Google Chrome. You won't get automatic updates on that channel until it reaches a version later than what you're already running.\u003c/li\u003e\u003cli\u003eYou can uninstall Google Chrome and re-install from \u003ca href\u003d\"http://www.google.com/chrome\"\u003ehttp://www.google.com/chrome\u003c/a\u003e to go back to an earlier version.\u003c/li\u003e\u003cli\u003eIf you re-install an older version, you might find that your profile is not compatible (because the data formats changed in the newer version you had been running). You'll have to delete your profile data. Delete the User Data\\Default folder (see the Before You Change Channels section above for the location). If you made a back up of your Default directory, you can then rename it to Default so that you at least restore some of your previous bookmarks, most visited pages, etc.\u003c/li\u003e\u003cli\u003eIf the installer fails when you attempt to install an older version with a message indicating that your computer already has a more recent version of Chrome or Chrome Frame, you must also uninstall Chrome Frame. After doing so, the newer version of Chrome should install without difficulty.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chrome-release-channels"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6615721171050697760"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6615721171050697760"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6615721171050697760"}],"author":[{"name":{"$t":"Jason Kersey"},"email":{"$t":"kerz@chromium.org"}}],"sites$pageName":{"$t":"chrome-release-channels"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2041833823096149786"},"published":{"$t":"2010-07-27T00:28:30.319Z"},"updated":{"$t":"2018-07-02T08:49:13.636Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-07-02T08:49:11.294Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Policy Templates"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ca href\u003d\"/\" /\u003e\u003ca href\u003d\"/\" /\u003eTo ease your policy setup, several policy templates can guide you easily through the configurable options.\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTemplates can also be generated locally by building the policy_templates Chromium project.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWindows\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere are two types of templates available, an ADM and an ADMX template. You will want to verify what template type you can use on your network.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip\"\u003eZIP file of ADM/ADMX/JSON templates and documentation\u003c/a\u003e. \u003ca href\u003d\"https://dl.google.com/chrome/policy/beta_policy_templates.zip\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eBeta\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://dl.google.com/chrome/policy/dev_policy_templates.zip\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eDev\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e administrative templates are also available for testing them before a stable release.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eGoogle Update (auto-update) has its own templates as well, in \u003ca href\u003d\"https://dl.google.com/update2/enterprise/GoogleUpdate.adm\" style\u003d\"font-size:10pt;background-color:transparent\"\u003eADM\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e and \u003ca href\u003d\"http://dl.google.com/dl/update2/enterprise/googleupdateadmx.zip\"\u003eADMX\u003c/a\u003e forms.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe recommended way to configure policy on Windows is Group Policy Object (GPO), however on machines that are joined to an Active Directory domain, p\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eolicy settings may also be stored in the registry under \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;font-size:medium;line-height:16px;white-space:pre;background-color:transparent\"\u003eHKEY_LOCAL_MACHINE\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;font-size:medium;line-height:16px;white-space:pre;background-color:transparent\"\u003eHKEY_CURRENT_USER\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e in the following paths:\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eGoogle Chrome: Software\\Policies\\Google\\Chrome\\\u003c/li\u003e\u003cli\u003eChromium: Software\\Policies\\Chromium\\\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eMac\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ePolicies are defined on a Mac in a plist (property list) file. The latest plist template is included in the Google Chrome/Chromium installer package. \r\nTo find the plist:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003ca href\u003d\"https://www.google.com/chrome/\" target\u003d\"_blank\"\u003eDownload Google Chrome\u003c/a\u003e\u003c/li\u003e\u003cli\u003eOpen the bundle and find the Configuration folder\u003c/li\u003e\u003cli\u003eOpen a file called \u003cfont face\u003d\"courier new, monospace\"\u003ecom.google.Chrome.manifest\u003c/font\u003e. This is the latest plist template.\u003c/li\u003e\u003cli\u003eReview the plist template.\u003c/li\u003e\u003cli\u003eUse the template to create your own plist file.\u003c/li\u003e\u003cli\u003eCreate your own plist file with appropriate policies based on the plist template. Use the property list editor of your choice.\u003c/li\u003e\u003cli\u003eUse your system management tool to push the configuration file to client Macs.\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo see an example of how to load this file into Profile Manager, see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/mac-quick-start\"\u003eMac Quickstart guide\u003c/a\u003e. \u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote:\u003c/b\u003e Any other system management tool can be used instead of Profile Manager such as Jamf or Puppet.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eLinux\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eFor Linux, consult the HTML documentation contained in the \u003ca href\u003d\"https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip\" style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003eZIP file of ADM/ADMX templates and documentation\u003c/a\u003e for the JSON keys that correspond to each policy\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo see where to put this file, see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/linux-quick-start\"\u003eLinux Quickstart guide\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eGoogle Chrome OS\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e  Google Chrome OS devices that are \u003ca href\u003d\"https://support.google.com/chrome/a/answer/7497916\" target\u003d\"_blank\"\u003ejoined to an Active Directory domain\u003c/a\u003e can be managed via Group Policy.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e  The ADMX templates containing all applicable Chrome OS user and device policies can be found in the \u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  \u003c/span\u003e\u003ca href\u003d\"https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip\" style\u003d\"background-color:transparent;font-size:13.3333px\"\u003eZIP file of ADM/ADMX/JSON templates and documentation\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e. \u003c/span\u003e\u003ca href\u003d\"https://dl.google.com/chrome/policy/beta_policy_templates.zip\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eBeta\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e and \u003c/span\u003e\u003ca href\u003d\"https://dl.google.com/chrome/policy/dev_policy_templates.zip\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eDev\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e administrative templates are also available for testing them before a stable release.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/policy-templates"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2041833823096149786"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2041833823096149786"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2041833823096149786"}],"author":[{}],"sites$pageName":{"$t":"policy-templates"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1068332768953013512"},"published":{"$t":"2018-06-29T05:49:37.668Z"},"updated":{"$t":"2018-06-29T05:56:04.677Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-29T05:56:02.430Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome OS Battery Life Overview"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe design Chromium OS with the philosophy that devices provide users “all-day battery life.”  Because the notion of all-day battery life can be subject to interpretation, we use the philosophy to define a usage model for battery-powered devices. This model helps us define user expectations, and provide battery recommendations for Chromium OS devices.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Battery Usage Model\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eWe don’t have a say in how users use their device\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUsers can and will use their devices in diverse situations, with variable access to charging power.  Moreover, as devices and their uses change, the power requirements for systems evolve. As such, Chromium OS provides tests and diagnostics which allow both users and device manufacturers to ensure that they can achieve our notion of all-day battery life.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eActive use and standby-time are different.  \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhile some devices, notably mobile phones, blend battery life usage between active and standby states, we believe these states are separate, important elements of all-day battery life.  We define active use as situations in which a user is “working away from the plug.” We define standby time as situations in which the user is “idle away from the plug.” We expect a user’s typical day to include periods of both, but that the blend of states may vary day to day.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eTypical active-use should leave reasonable standby available.  \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImportantly, adhering to our notion of all-day battery life means that a user should be able to actively work for many hours and still have sufficient standby time to reach a power source and recharge the device.  Our belief is that standby power consumption should be at least an order of magnitude less that active-use power consumption. Thus, if a device has been used for 80% of active-use time, the remaining 20% should translate into a substantial amount of standby time in which the device can be recharged without forced shutdown.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eShutdown provides longevity beyond typical use.  \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhile a device is shutdown, it can conserve most of its battery life.  While our notion of all-day battery life does not assume shutdowns, we believe that the fast-booting nature of Chromium OS should make it easy for users to strongly preserve battery life when they desire. \u003c/span\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eA Typical Use Case\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOur philosophy, and its derived battery usage model, is well illustrated by an example.  Consider a typical Chromium OS user, whose device achieves the average 10 hours of active-use battery life.  Our usage model expects that this user:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCan use their device in active mode for an 8-hour workday, and have 20% of battery remaining.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe remaining 20% of battery life should translate into more than a day of standby time; roughly 30 hours.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13pt;font-family:Arial;background-color:transparent;font-weight:700;vertical-align:baseline;white-space:pre-wrap\"\u003eBattery Recommendations\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGiven the philosophy and usage model, Chromium OS recommends that device batteries be sized such that an average of 10 active hours can be achieved on the device before recharging.  Thus, if a device consumes 4 Watts for each hour of active time, a 40 Watt-Hour battery is recommended.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chrome-os-battery-life-overview"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1068332768953013512"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1068332768953013512"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1068332768953013512"}],"author":[{"name":{"$t":"Dan McClary"},"email":{"$t":"dwmclary@chromium.org"}}],"sites$pageName":{"$t":"chrome-os-battery-life-overview"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6196468437789782208"},"published":{"$t":"2015-12-02T23:34:40.736Z"},"updated":{"$t":"2018-06-29T00:02:45.563Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-29T00:02:43.463Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Paint team members"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eChris Harrelson (chrishtr@) TL\u003cdiv\u003ePhilip Rogers (pdr@)\u003c/div\u003e\u003cdiv\u003eWalter Korman (wkorman@)\u003c/div\u003e\u003cdiv\u003eTien-Ren Chen (trchen@)\u003c/div\u003e\u003cdiv\u003eXianzhu Wang (wangxianzhu@)\u003c/div\u003e\u003cdiv\u003eStephen Chenney (schenney@)\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eWeiliang Chen (weiliangc@)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCanvas subteam:\u003c/div\u003e\u003cdiv\u003eJustin Novosad (junov@) TL\u003c/div\u003e\u003cdiv\u003eAli Juma (ajuma@)\u003c/div\u003e\u003cdiv\u003eOlivia Lai (xlai@)\u003c/div\u003e\u003cdiv\u003eXida Chen (xidachen@)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAdjuncts:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFredrik Söderquist (fs@opera.com)\u003c/div\u003e\u003cdiv\u003eFlorin Malita (fmalita@) \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3545069394357994158"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/paint-team/paint-team-members"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6196468437789782208"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6196468437789782208"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6196468437789782208"}],"author":[{"name":{"$t":"Chris Harrelson"},"email":{"$t":"chrishtr@chromium.org"}}],"sites$pageName":{"$t":"paint-team-members"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/555895950704647362"},"published":{"$t":"2015-06-16T18:14:57.894Z"},"updated":{"$t":"2018-06-28T05:20:31.965Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-28T05:20:29.503Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Encrypted Partition Recovery"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eBackground\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eStarting with R22, \u003cfont face\u003d\"courier new, monospace\"\u003e/var\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003e/home/chronos\u003c/font\u003e are bind mounted from the encrypted stateful partition (\u003cfont face\u003d\"courier new, monospace\"\u003e/mnt/stateful_partition/encrypted\u003c/font\u003e). Since this partition is tied to the TPM state, it will not be available when switching to dev mode, and cannot be decrypted if the drive is removed from the device. Additionally, some devices don't have a removable drive, making content extraction very difficult even without handling the encryption.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe current process to extract the contents depends on a signed recovery image written to a USB stick that has been modified to start the extraction process. This will cause the system to reboot twice: first into verified mode to perform decryption and then back into recovery mode to copy the results to the USB stick. Specifically, this will copy the user’s eCryptfs home directory contents (and, when the user is the System Owner,\u003cspan style\u003d\"font-size:13.3333330154419px;background-color:transparent\"\u003e also the \"encrypted stateful\" system partition) \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eto the recovery USB stick.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003ePrerequisites\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObtain device in verified mode that is misbehaving (this process assumes it does not misbehave until after \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"font-size:10pt;background-color:transparent\"\u003ecryptohomed\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e has started running).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObtain device user's username (full email address) and password.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObtain USB stick at least 4GB in size.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObtain \u003ca href\u003d\"https://support.google.com/chromebook/answer/1080595\"\u003esigned recovery image\u003c/a\u003e for the device.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eGenerate modified recovery image for stateful partition extraction:\u003c/span\u003e\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ePut image inside \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\"\u003ecros chroot\u003c/a\u003e (e.g. \u003cfont face\u003d\"courier new, monospace\"\u003e~/trunk/recovery_image.bin\u003c/font\u003e).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eRun modification script (this grows the recovery image’s stateful partition to 3GB to hold the device’s stateful contents, and creates a flag file): \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e~/trunk/src/platform/dev/\u003c/span\u003econtrib\u003cspan style\u003d\"font-size:10pt\"\u003e/mod_recovery_for_decryption.sh --image ~/trunk/recovery_image.bin --to ~/trunk/recovery_decrypt.bin\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eWrite modified recovery image to USB stick.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eProcess\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eDO NOT switch device to Developer mode, as the TPM will get cleared, making it impossible to decrypt the stateful partition.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eBoot device into Recovery mode.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eInsert modified recovery USB stick (built during “Prerequisites” above).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve \"Stateful recovery requested.\" statement on-screen, then wait. (If normal recovery mode starts doing image verification, power off the device before it overwrites itself, and see troubleshooting below).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve “Stateful recovery requires authentication.” Enter username (full email address) and password, then wait. (\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eTo include the system partition in the recovery, the System Owner's credentials should be used.)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve automatic reboot back into Verified mode. Wait at login screen while files are copied. Copying may take some time, so be patient. If the device has a disk activity light, it should show activity during this step.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve automatic reboot back into Recovery mode.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve \"Stateful recovery requested.\" statement on-screen, then wait. (If normal recovery mode starts doing image verification, power off the device before it overwrites itself, and see troubleshooting below).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve “Prior recovery request exists. Attempting to extract files.” on-screen, then wait while files are copied.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eObserve “Operation complete, you can now remove your recovery media.”\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ePull USB stick, and mount first partition on a test machine. Device’s recovered contents will be in \u003cfont face\u003d\"courier new, monospace\"\u003e/recovery/decrypted/\u003c/font\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eTroubleshooting\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eIf the on-screen statement in step 4 (or 8) is not seen, something went wrong with the recovery image modification, and the device should be powered off to avoid wiping the device’s stateful partition. Recheck the prerequisites, and make sure the image on the USB stick was successfully modified.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf the system never reboots to step 7, the system is likely in such a bad state that even \u003cfont face\u003d\"courier new, monospace\"\u003ecryptohomed\u003c/font\u003e hasn’t started. Handling this situation is out of scope of this document; a new bug should be opened for this. Large copies can take a while, so check for disk activity.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf step 10 fails (e.g. “Copying failed. Please resize your stateful partition and try again!”), something went wrong with the copying from the device to the USB stick. On devices that have a removable drive, the decrypted files should be visible in \u003cfont face\u003d\"courier new, monospace\"\u003e/mnt/stateful_partition/decrypted\u003c/font\u003e. Otherwise, try again with a larger USB stick, and increase the number of sectors used when modifying the recovery image via the \u003cfont face\u003d\"courier new, monospace\"\u003e--statefulfs_sectors\u003c/font\u003e argument.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/encrypted-partition-recovery"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/555895950704647362"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/555895950704647362"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/555895950704647362"}],"author":[{"name":{"$t":"Kees Cook"},"email":{"$t":"keescook@chromium.org"}}],"sites$pageName":{"$t":"encrypted-partition-recovery"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"XCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6240228859543216111"},"published":{"$t":"2011-02-15T17:00:45.424Z"},"updated":{"$t":"2018-06-27T09:09:01.409Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-27T09:08:59.362Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Network-based Development"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-FIXME:-Most-of-the-instructions-below-seem-to-apply-only-to-ancient-boards-running-U-Boot.\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003eFIXME: Most of the instructions below seem to apply only to ancient boards running U-Boot.\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Motivation\" /\u003eMotivation\u003c/h2\u003e[If you are familiar with/sold on network-based development you can skip this introduction.]\u003cbr /\u003e\u003cbr /\u003eDevelopment with a target device, where software is built on a separate host, is quite different from host-based development. Perhaps the biggest problem is that the host and target have different filesystems. The host filesystem is close to you, easy to interact with, large, fast and always available. The target filesystem is typically inaccessible from your host, has poor tools, is small, pretty slow and only exists when the target is running.\u003cbr /\u003e\u003cbr /\u003eCommon problems are:\u003cbr /\u003e\u003cul\u003e\u003cli\u003egetting a new kernel onto your target;\u003c/li\u003e\u003cli\u003echanging kernel parameters (kernel command line);\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eupdating the root filesystem on your target;\u003c/li\u003e\u003cli\u003einstalling into your target a new version of a software package you are working on;\u003c/li\u003e\u003cli\u003eusing a GUI debugger on the host to debug software on the target;\u003c/li\u003e\u003cli\u003eaccessing host data files on your target;\u003c/li\u003e\u003cli\u003ewriting to log files on your host from your target.\u003c/li\u003e\u003c/ul\u003eMany ad-hoc solutions are available for the above. You can use a USB stick or SD card to transport the kernel or a new root filesystem. You can change kernel parameters by rebuilding the kernel. If you have a network available you can use the scp command to copy over a program to run, copy log and data files around, etc. You can even use sshfs to run a filesystem over the network.\u003cbr /\u003e\u003cbr /\u003eThese problems are worse when you want to have a lab full of targets all doing similar things. In this case each board must be reconfigured using an SD card and manual intervention when a kernel update is required, or a log file must be pulled off. In fact, anything which exists on the target device is something that might be out of date, something to check, or something that will make that target different in undesirable ways.\u003cbr /\u003e\u003cbr /\u003eIn short it is desirable to keep as little as possible on the target device. If a network is available at all stages of the boot process, you can use that instead of the filesystem. At the minimum you need to identify the target, so it needs a name and perhaps a serial number. Everything else can be loaded from an attached network.\u003cbr /\u003e\u003cbr /\u003eCommon objections to using a network, compared to an SD card say, are:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\"But it is slower than having local storage in the target.\" Network speed is typically 10MB/s and can be faster. You should take account of the time spent copying onto the SD card as well as the time the target takes copying it off.\u003c/li\u003e\u003cli\u003e\"But it makes my target boot process different from the way it will actually boot in the field.\" True, although you can easily test it, and for most testing purposes (with the notable exception of benchmarking) the boot device seldom affects operation.\u003c/li\u003e\u003cli\u003e\"But I never change my kernel / root disk and never need to change files anyway.\" You are probably not doing development. Why are you reading this page?\u003c/li\u003e\u003cli\u003e\"But I can never be sure what the target has actually picked up.\" You can check the kernel header, and touch a file visible to the target which you can check.\u003c/li\u003e\u003cli\u003e\"But my target doesn't have a real time clock.\" Most ARM SOCs have a serviceable one built in, but in any case you don't really need one. If you need to, just set the time in a startup script using an ntp utility or similar.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\"But I don't have a network.\" You should have thought of that before you developed your device. Ethernet chips and connectors are cheap enough that they should be on your board for debug reasons alone. There is a valuable difference between development and production hardware. Failing that, perhaps a USB Ethernet adapter will help?\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\"But it is too difficult to set up; I don't understand NFS; the \r\nnetwork around here is unreliable; I am allergic to NFS servers; tftp is \r\ninsecure; I don't have a spare network port; it feels unnatural; I have \r\nan SD card for this purpose; my parents didn't use a network for \r\nembedded development when I was growing up; etc.\" You will need to work through these issues yourself.\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Chromium-OS-Approach\" /\u003eChromium OS Approach\u003c/h2\u003e(ARM only, for now).\u003cbr /\u003e\u003cbr /\u003eOur approach to network-based development is:\u003cbr /\u003e\u003c/div\u003e\u003cul\u003e\u003cli\u003eU-Boot is flashed into the board as a starting point\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eU-Boot environment variables specify boot method, including network servers\u003c/li\u003e\u003cli\u003eDHCP is used to obtain an IP address\u003c/li\u003e\u003cli\u003eTFTP is used to read the kernel\u003c/li\u003e\u003cli\u003eNFS Root is used to provide the root disk\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eThe remainder of this page shows how to set this up.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-U-Boot-on-the-board\" /\u003eU-Boot on the board\u003c/h2\u003eChromium OS has several variants of U-Boot for each board, one of which is \u003cb\u003ethe developer variant\u003c/b\u003e. The developer variant has a number of additional features useful to devs: network support, an expanded command set and a saved environment.\u003cbr /\u003e\u003cbr /\u003eFirst, make sure that you have flashed the developer U-Boot onto your board. For more information see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/u-boot\"\u003eU-Boot page\u003c/a\u003e.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Supported-USB-Ethernet-Adapters-USB-Ethernet-Dongles\" /\u003eSupported USB Ethernet Adapters / USB Ethernet Dongles\u003c/h3\u003eOnly the ASIX AX88772 chip is supported at present. The following supported adapters are shown as {vendor, device}. Type \u003ccode\u003elsusb\u003c/code\u003e, on a machine running Linux, with the adapter attached to see the vendor and device numbers for your adapter.\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x05ac, 0x1402 },    /* Apple USB Ethernet Adapter */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x07d1, 0x3c05 },    /* D-Link DUB-E100 H/W Ver B1 */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x0b95, 0x772a },    /* Cables-to-Go USB Ethernet Adapter */  \u003c/code\u003e\u003cfont color\u003d\"#ff0000\"\u003eTODO(dianders): This didn't work for me.\u003c/font\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x0b95, 0x7720 },    /* Trendnet TU2-ET100 V3.0R */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x0b95, 0x1720 },    /* SMC */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x0db0, 0xa877 },    /* MSI - ASIX 88772a */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x13b1, 0x0018 },    /* Linksys 200M v2.1 */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x1557, 0x7720 },    /* 0Q0 cable ethernet */\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    { 0x2001, 0x3c05 },    /* DLink DUB-E100 H/W Ver B1 Alternate */\u003c/code\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-U-Boot-Environment-Variables\" /\u003eU-Boot Environment Variables\u003c/h2\u003eWhen you start the developer U-Boot for the first time it will likely complain that the environment is not present, and give you a default environment. Type \u003ccode\u003eprintenv\u003c/code\u003e to see what it defines.\u003cbr /\u003e\u003cbr /\u003eTo set your board up for full network booting you need to set the following. Replace the IP addresses in the following with the address of your server. In fact, typical U-Boot flow is to use \u003ccode\u003eserverip\u003c/code\u003e for all the server addresses, and have this obtained automatically from the DHCP server. However in many corporate network environments this is difficult.\u003cbr /\u003e\u003cbr /\u003eNote: It is a great idea if your DHCP server can give you the same IP address each time. It does this by looking at the MAC address on your board / Ethernet adapter.  Note that you should replace \u003ccode\u003e\u003cb\u003eyourUsernameHere\u003c/b\u003e\u003c/code\u003e with the username you'll be using on your host machine and \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e with anything you want.  You should also change the IP address to be the IP addresses of your servers.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esetenv serverip 172.22.73.60\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv tftpserverip 172.22.73.60\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv nfsserverip 172.22.73.60\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv board \u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003etegra2_seaboard\u003c/span\u003e\u003cbr /\u003e\u003ccode\u003esetenv serial# \u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv user \u003cb\u003eyourUsernameHere\u003c/b\u003e\u003cbr /\u003esetenv tftppath /uImage-${user}-${board}-${serial#}\u003cbr /\u003esaveenv\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eOther variables are set automatically by the boot scripts:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003erootpath\u003d/export/nfsroot-${user}-${board}-${serial#}\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003eThere are two paths that your server must provide. The first is the path to your kernel on your tftp server, and the second is the path to your root disk on your NFS server. By adding the username, board and serial number it makes it possible for a team to share a single TFTP/NFS server.\u003cbr /\u003e\u003cbr /\u003eBy default the IP address is obtained using DHCP. If you don't have a DHCP server you can set the environment variables directly. You will need to create your own boot flow which skips bootp.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003egatewayip\u003d172.22.73.1\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003enetmask\u003d255.255.255.0\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eipaddr\u003d172.22.73.81\u003c/code\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-U-Boot-Boot-Flow\" /\u003eU-Boot Boot Flow\u003c/h3\u003eU-Boot starts by running an environment variable called \u003ccode\u003ebootcmd\u003c/code\u003e. This starts up USB then tries various ways of obtaining a kernel:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003edhcp_boot\u003c/code\u003e - uses DHCP to get an IP address, TFTPs the kernel from a fixed server, then boots with NFS root from a fixed server\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003ekeynfs_boot\u003c/code\u003e - reads the kernel from file '/uImage' on an attached USB stick (first partition in ext2 format), then boots with NFS root\u003c/li\u003e\u003cli\u003e\u003ccode\u003eusb_boot\u003c/code\u003e - reads a developer image in standard Chromium OS format from a USB stick (not network boot)\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003emmc_boot\u003c/code\u003e - reads a developer image in standard Chromium OS format from eMMC (not network boot)\u003c/li\u003e\u003c/ul\u003eThe first method to succeed is used for the boot. This means that if you don't have a network attached, and your USB stick does not have uImage on it, then it will try to read a Chromium OS format image from the stick. If no stick is inserted, it will try to boot from internal eMMC.\u003cbr /\u003e\u003cbr /\u003eTo adjust the boot flow you should create your own boot command. For example you might create a method that loads a kernel from partition 2 of the USB stick, so replacing \u003ccode\u003enfskey_boot\u003c/code\u003e,. Then change the \u003ccode\u003ebootcmd\u003c/code\u003e so it only runs your flow (NOTE: you may need to paste it a little bit at a time):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\u003ccode\u003esetenv mynfs_setup 'setenv rootpath /export/nfsroot-${user}-${board}-${serial#}; run regen_net_bootargs'\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv mynfs_boot 'run keynfs_setup; ext2load usb 0:2 ${loadaddr} uImage; bootm ${loadaddr}'\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esetenv bootcmd run mynfs_boot\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esaveenv\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-a-DHCP-server\" /\u003eSetting up a DHCP server\u003c/h2\u003eThe DHCP server provides IP addresses to targets on your network. If you have a DHCP server already, skip to the end of this section to test it. Otherwise you will need to set one up. This is a very brief guide.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo aptitude install dhcp3-server\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eEdit /etc/dhcp3/dhcpd.conf and add details about your subnet, including the range of IP addresses you want to give out and any fixed IP addresses you want to allocate for your targets:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esubnet 192.168.4.0 netmask 255.255.255.0 {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  range 192.168.4.20 192.168.4.50;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  option routers 192.168.4.1;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e}\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003ehost seaboard {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  hardware ethernet 00:23:7d:09:80:0e;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  fixed-address seboard0;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e}\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e(you may want to put seaboard0 in your \u003ccode\u003e/etc/hosts\u003c/code\u003e file in this example, or you can use a numeric address)\u003cbr /\u003e\u003cbr /\u003eThen start up the server:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e/etc/init.d/dhcp3-server restart\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eIf there are no errors (\u003ccode\u003etail /var/log/syslog\u003c/code\u003e) you should be in business.\u003cbr /\u003e\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Testing-your-DHCP-server\" /\u003eTesting your DHCP server\u003cbr /\u003e\u003c/h4\u003eAt this stage you should be able to boot your target and see it get a valid IP address:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCrOS\u0026gt; usb start\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e(Re)start USB...\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eUSB:   Tegra ehci init hccr c5008100 and hcor c5008140 hc_length 64\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eRegister 10011 NbrPorts 1\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eUSB EHCI 1.00\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003escanning bus for devices... 5 USB Device(s) found\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e       scanning bus for storage devices... 1 Storage Device(s) found\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e       scanning bus for ethernet devices... 1 Ethernet Device(s) found\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eCrOS\u0026gt; bootp\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eWaiting for Ethernet connection... done.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eBOOTP broadcast 1\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eDHCP client bound to address 172.22.73.81\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eCrOS\u0026gt; \u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Setting-up-a-TFTP-server\" /\u003eSetting up a TFTP server\u003c/h3\u003eThe TFTP server will send a kernel to U-Boot when it asks. If you have one already skip to the end of this section to test it.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo aptitude install tftpd-hpa\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003eThen edit \u003ccode\u003e/etc/default/tftpd-hpa\u003c/code\u003e like this replacing \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;line-height:13px\"\u003e\u003cb\u003eyourUsernameHere\u003c/b\u003e\u003c/span\u003e with your own username (\u003ccode\u003eecho $USER\u003c/code\u003e):\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eTFTP_USERNAME\u003d\"\u003cb\u003eyourUsernameHere\u003c/b\u003e\"\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eTFTP_DIRECTORY\u003d\"/tftpboot\"\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eTFTP_ADDRESS\u003d\"0.0.0.0:69\"\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eTFTP_OPTIONS\u003d\"-v\"\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eNotes:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWe remove \u003cfont face\u003d\"'courier new', monospace\"\u003e--secure\u003c/font\u003e from default config, since we want to access a symlink that doesn't exist in the \u003ccode\u003etftpboot\u003c/code\u003e directory.\u003c/li\u003e\u003cli\u003eWe move from \u003ccode\u003e/var/lib/tftpboot\u003c/code\u003e to \u003ccode\u003e/tftpboot\u003c/code\u003e, since we need to specify full path when \u003ccode\u003e--secure\u003c/code\u003e isn't needed and \u003ccode\u003e/tftpboot\u003c/code\u003e is shorter.\u003c/li\u003e\u003cli\u003eWe don't use the \u003ccode\u003etftp\u003c/code\u003e username, since it can't access the kernel we build.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eSuggestions for good workflows that fix some of the above would be appreciated.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNow prepare it. We want a symlink from the /tftpboot directory to you kernel, so the target can easily read it. Replace the filename with your user, board and serial.  NOTE: this assumes that you've got your chromiumos source code in \u003ccode\u003e/home/$USER/chromiumos\u003c/code\u003e:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecd /tftpboot\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esudo ln -s /home/$USER/chromiumos/chroot/build/tegra2_seaboard/boot/vmlinux.uimg uImage-$USER-tegra2_seaboard-\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003ccode\u003esudo restart tftpd-hpa\u003c/code\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Testing-your-TFTP-server\" /\u003eTesting your TFTP server\u003c/h4\u003eEnsure that you have an IP address (as shown in the DHCP section above). Then this should read in the kernel (assuming you've built it):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003etftpboot ${loadaddr} ${tftpserverip}:/tftpboot/uImage-${user}-${board}-${serial#}\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eYou'll see this output if things are working well:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eWaiting for Ethernet connection... done.\u003cbr /\u003eUsing asx0 device\u003cbr /\u003eTFTP from server 172.22.73.60; our IP address is 172.22.73.81\u003cbr /\u003eFilename '/tftpboot/uImage-yourUsernameHere-seaboard-\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eyourSerialNumberHere\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e'.\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eLoad address: 0x40c000\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eLoading: #################################################################\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e     #################################################################\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e     #################################################################\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e     ###############################################\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003edone\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eBytes transferred \u003d 3545596 (3619fc hex)\u003c/span\u003e\u003c/div\u003e\u003cbr /\u003eIf you have got this far, congratulations! You are about half way there: the target is reading a kernel directly from your machine and is ready to boot it. Now we need to get the root disk organized.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-NFS-Root\" /\u003eNFS Root\u003c/h2\u003eNFS root is a simple way to keep your target's root disk be kept on the network.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv\u003eAdvantages:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eYou can \r\nmake a change anywhere in the filesystem from your host, and the target \r\nsee it almost immediately and without any special manual transfer\u003c/li\u003e\u003cli\u003eYou can make use of the effectively infinite disc space of most hosts (great for debug builds)\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eBuild / debug turnaround time is quick since there is no need to transfer the image via USB. (But see also the dev_server)\u003c/li\u003e\u003cli\u003eYou can set things up with symlinks so that the host and target can use the same filepaths\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eDisadvantages:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eIt takes a bit of setup\u003c/li\u003e\u003cli\u003eSlower than a local disc unless you have a fast Gigabit Ethernet (non-USB)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003eLinux\r\n requires a root filesystem which it mounts immediately after booting. \r\nIf you have a suitable network device attached to the client you can use\r\n an NFS server to provide this root filesystem. This means that your \r\nclient can have full access to your server filesystem, thus removing the\r\n need to manually move files from the host to the client for execution, \r\nand back again for editing / viewing.\u003cbr /\u003e\u003cbr /\u003eYou can find information about setting up NFS root \u003ca href\u003d\"https://wiki.archlinux.org/index.php/NFSv4\" rel\u003d\"nofollow\"\u003ehere\u003c/a\u003e.\r\n These instructions replicate much of that, and generally follow the \r\nsame pattern but are more specific to Chromium OS. Note that you can use\r\n NFSv3 instead but here we will use NFSv4 as it has additional features.\r\n \u003cbr /\u003e\u003cbr /\u003eThe steps you need to take are:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eSet up an NFS server on your host, or use one that you already have\u003c/li\u003e\u003cli\u003eBuild a kernel with suitable filesystem and driver options\u003c/li\u003e\u003cli\u003eSet up your boot loader to tell the kernel to use an NFS root\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Setting-up-an-NFS-server\" /\u003eSetting up an NFS server\u003c/h3\u003eFirst,\r\n install the NFS server package (these instructions for Ubuntu 10.04 \r\nLucid). This enables the NFS server built into your kernel. When it \r\nstarts you may notice that a number of new modules have been loaded into\r\n your kernel (nfsd, exportfs, lockd, etc.)\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo aptitude install nfs-kernel-server\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThe server needs to know which directories you want to 'export' for clients. This is specified in the \u003ccode\u003e/etc/exports\u003c/code\u003e file. Edit this (\u003ccode\u003esudo nano /etc/exports\u003c/code\u003e or similar) to look something like this (changing IP subnets as appropriate):\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e/export            172.16.0.0/16(rw,fsid\u003d0,no_subtree_check,async)\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e/export/nfsroot-\u003cb\u003eyourUsernameHere\u003c/b\u003e-tegra2_seaboard-\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e    172.16.0.0/16(rw,nohide,no_subtree_check,async,no_root_squash)\u003c/span\u003e\u003c/div\u003e\u003cbr /\u003eThe first entry sets the base of the NFS exports. Every directory which is exported must be accessible from within \u003ccode\u003e/export\u003c/code\u003e.\r\n The second entry is the nfsroot directory which will contain your root \r\nfilesystem. This is the directory that the client will see when it \r\nmounts the NFS root. The IP address should be changed to match your \r\nlocal setup - it sets the range of IP addresses which are allowed to access this mount on the server. For example it might be \u003ccode\u003e192.168.1.0/24\u003c/code\u003e.\u003cbr /\u003e\u003cbr /\u003eA number of options are provided, briefly:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003erw\u003c/b\u003e\r\n - the target will have both read and write access. You can also use ro \r\nfor readonly but the system will not boot with a read-only root \r\nfilesystem (without a bit of work!)\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003efsid\u003d0\u003c/b\u003e - tells NFS that this is the root of all exported filesystems\u003c/li\u003e\u003cli\u003e\u003cb\u003eno_subtree_check\u003c/b\u003e\r\n disables checking for accesses outside the exported portion of a \r\nfilesystem. This speeds up and simplifies things for the client and \r\nserver.\u003c/li\u003e\u003cli\u003e\u003cb\u003easync\u003c/b\u003e - requests are acknowledged before data is \r\nactually written. For example if the client writes to a file, the server\r\n will respond that the write has completed, and then continue in the \r\nbackground to actually do the write, perhaps to a disc drive. This \r\nimproves performance.\u003c/li\u003e\u003cli\u003e\u003cb\u003eno_root_squash\u003c/b\u003e - the target can \r\naccess files as root, with full unrestricted permissions. This is \r\nimportant for the root filesystem because the kernel would otherwise not\r\n have access to devices in /dev, log files in /var/log, etc.\u003c/li\u003e\u003cli\u003e\u003cb\u003enohide\u003c/b\u003e - tells the NFS server to show the contents of a directory even if it is mounted from elsewhere\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003eWe now need to make the root filesystem appear in \u003ccode\u003e/export/nfsroot\u003c/code\u003e. Rather than just copy it there, we will use a 'bind mount' to paste the true location onto \u003ccode\u003e/export/nfsroot\u003c/code\u003e. First we need to unpack a suitable image (see the build instructions for how to build an image).\u003cbr /\u003e\u003cbr /\u003eLet's assume that you have your Chromium trunk directory as \u003ccode\u003e~/cosarm\u003c/code\u003e and you are using a \u003ccode\u003etegra2_seaboard\u003c/code\u003e build:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\u003ccode\u003e# go to the directory with the latest build\u003cbr /\u003ecd ~/cosarm/src/build/images/tegra2_seaboard/latest\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e# mount it into /tmp/m\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e~/cosarm/src/scripts/mount_gpt_image.sh -f . -i chromiumos_test_image.bin\u003c/code\u003e\u003ccode\u003e\u003cbr /\u003e\u003cbr /\u003e# copy out the contents of the image\u003cbr /\u003esudo cp -a /tmp/m nfsroot\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e# unmount the image from /tmp/m\u003cbr /\u003e\u003c/code\u003e\u003ccode\u003e~/cosarm/src/scripts/mount_gpt_image.sh -u\u003c/code\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThis will put a full copy of the build image root disc into \u003ccode\u003e~/cosarm/src/build/images/tegra2_seaboard/latest/nfsroot\u003c/code\u003e. Now we need to make it appear in \u003ccode\u003e/export/nfsroot\u003c/code\u003e. Edit your \u003ccode\u003e/etc/fstab\u003c/code\u003e file with the full path:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e/full/path/to/cosarm/src/build/images/tegra2_seaboard/latest/nfsroot /export/nfsroot-\u003cb\u003eyourUsernameHere\u003c/b\u003e-tegra2_seaboard-\u003cb\u003eyourSerialNumberHere\u003c/b\u003e    none    bind    0 0\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eNote this must appear all on one line and you can use tabs or spaces between fields. See \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eman fstab\u003c/code\u003e for more information.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou will need to create an /export/nfsroot directory:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ sudo mkdir -p /export/nfsroot\u003c/code\u003e\u003ccode\u003e-\u003cb\u003eyourUsernameHere\u003c/b\u003e-tegra2_seaboard-\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e This\r\n will be activated automatically when your server reboots, but since it \r\nis already running, ask it to mount this now. After the mount you will \r\nsee that the root filesystem has appeared at \u003ccode\u003e/export/nfsroot\u003c/code\u003e as desired.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ sudo mount /export/nfsroot\u003c/code\u003e\u003ccode\u003e-\u003cb\u003eyourUsernameHere\u003c/b\u003e-tegra2_seaboard-\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003ccode\u003e$ ls /export/nfsroot\u003c/code\u003e\u003ccode\u003e-\u003cb\u003eyourUsernameHere\u003c/b\u003e-tegra2_seaboard-\u003c/code\u003e\u003ccode\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e/\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003ebin   dev  home  lost+found  mnt  postinst  root  share  tmp     usr\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eboot  etc  lib   media       opt  proc      sbin  sys    u-boot  var\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e$\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eCheck that your \u003ccode\u003e/etc/idmapd.conf\u003c/code\u003e\r\n is correct. You can leave the domain as is if you like. If you change \r\nit, be careful that the same domain is used on the client side (not \r\nrelevant for NFS root though). This file sets up mapping of user and \r\ngroup names between the client and server and is a key benefit of NFSv4 \r\nover NFSv3.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e[General]\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003eVerbosity \u003d 0\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003ePipefs-Directory \u003d /var/lib/nfs/rpc_pipefs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eDomain \u003d local.domain.edu\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e[Mapping]\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003eNobody-User \u003d nobody\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003eNobody-Group \u003d nogroup\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eAlso check your portmap settings. If this is wrong then the boot will fail with a message like 'VFS: Unable to mount root fs via NFS, trying floppy.'. The settings are in \u003ccode\u003e/etc/defaults/portmap\u003c/code\u003e. Make sure it is set to provide the service to other machines. If your options are set to \"-i 127.0.0.1\" then it will only work locally (not a useful server!). Change it to \u003ccode\u003eOPTIONS\u003d\"\"\u003c/code\u003e and then 'restart portmap'. You can test this:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ rpcinfo -p 172.22.73.60    # use hostname or IP address of your NFS server\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003erpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eIf it is working you will see something like:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ rpcinfo -p 172.22.73.60 |grep nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    2   udp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    3   udp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    4   udp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    2   tcp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    3   tcp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    100003    4   tcp   2049  nfs\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eRestart the NFS kernel server if you are superstitious:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\u003ccode\u003e$ sudo /etc/init.d/nfs-kernel-server restart\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e * Stopping NFS kernel daemon                                            [ OK ] \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e * Unexporting directories for NFS kernel daemon...                      [ OK ] \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e * Exporting directories for NFS kernel daemon...                        [ OK ] \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e * Starting NFS kernel daemon                                            [ OK ]\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTest your nfs server setup. This example just mounts the nfsroot on the same machine, but it is useful to do this from another machine is possible (if you can, use your server host name instead of localhost).\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e$ sudo mkdir -p /tmp/nfs4\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ sudo mount -t nfs4 localhost:/nfsroot /tmp/nfs4\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ ls /tmp/nfs4\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003ebin  boot  build  dev  etc  home  lib  lost+found  media  mnt  opt  postinst  proc  root  sbin  share  sys  tmp  usr  var\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ sudo umount /tmp/nfs4\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eFinally, the standard firewall setup in Chromium OS does not permit NFS. You may wish to simply disable the firewall - the \u003ccode\u003e/export/nfsroot\u003c/code\u003e\u003ccode\u003e-\u003cspan style\u003d\"line-height:13px\"\u003e\u003cb\u003eyourUsernameHere\u003c/b\u003e\u003c/span\u003e-tegra2_seaboard-\u003c/code\u003e\u003ccode\u003e\u003cspan style\u003d\"line-height:13px\"\u003e\u003cb\u003eyourSerialNumberHere\u003c/b\u003e\u003c/span\u003e/etc/init/iptables.conf\u003c/code\u003e file should be changed to do this. At the top, change the \u003ccode\u003estart on\u003c/code\u003e line to \u003ccode\u003estart on never\u003c/code\u003e.\r\n If you don't do this you will likely boot to a login prompt, but then \r\nyou will see 'NFS server not responding' messages once the firewall \r\nkicks in.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Build-a-suitable-kernel\" /\u003eBuild a suitable kernel\u003c/h3\u003eYou can build an NFS-enabled kernel for Chromium OS with something like:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eUSE\u003dnfs emerge-tegra2_seaboard chromeos-kernel\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis puts a kernel in /build/\u0026lt;board\u0026gt;/boot/vmlinux.uimg.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003eTODO(dianders): Maybe this is what we want?\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eUSE\u003dnfs FEATURES\u003d\"noclean\" cros_workon_make --board\u003d${BOARD} --install kernel\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Longer-Explanation\" /\u003eLonger Explanation\u003c/h4\u003eThere are quite a \r\nfew options that you need to enable in the kernel to support NFS root. \r\nFirst you need to make sure that a suitable network driver is compiled \r\nin, and secondly you need to enable all the network filesystem options. \r\nThe following list for a USB network adapter setup gives you an idea of \r\nwhat is required. Some of the important options are:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eCONFIG_USB_USBNET - enables the USB network subsystem\u003c/li\u003e\u003cli\u003eCONFIG_NET_AX8817X - enables the particular USB driver. This is a Cisco / Linksys 1000Mbit USB 2.0 Ethernet dongle\u003c/li\u003e\u003cli\u003eCONFIG_NETWORK_FILESYSTEMS - enables network filesystem support\u003c/li\u003e\u003cli\u003eCONFIG_NFS_COMMON, CONFIG_NFS_FS - enable NFS client in kernel\u003c/li\u003e\u003cli\u003eCONFIG_ROOT_NFS - enable NFS root function\u003c/li\u003e\u003cli\u003eCONFIG_IP_PNP, CONFIG_IP_PNP_DHCP - required if parameter ip\u003ddhcp is passed to kernel\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/kernel-configuration\"\u003eSee here\u003c/a\u003e for more information about kernel configuration.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv /\u003e\u003cdiv\u003eNote: some of the options below are required for NFS root, some for NFS mounting and some for NFS serving\u003cfont color\u003d\"#ff0000\"\u003e.\u003cbr /\u003e\u003c/font\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echromeos/config/armel/config.flavour.chromeos-tegra2\u003c/code\u003e:\u003cbr /\u003e\u003ccode\u003eCONFIG_USB_NET_AX8817X\u003dy\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"border-collapse:separate;color:rgb(0,0,0);font-family:Times New Roman;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium\"\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:14px;line-height:14px\"\u003echromeos/config/config.common.chromeos:\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_DNOTIFY\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_DNS_RESOLVER\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_LOCKD\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_LOCKD_V4\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NETWORK_FILESYSTEMS\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFSD\u003dm\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFSD_V3\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFSD_V4\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFS_COMMON\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFS_FS\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFS_USE_KERNEL_DNS\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFS_V3\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_NFS_V4\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_ROOT_NFS\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_RPCSEC_GSS_KRB5\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_SUNRPC\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_SUNRPC_GSS\u003dy\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e+CONFIG_USB_USBNET\u003dy\u003c/code\u003e\u003ccode\u003e\u003cbr /\u003e+CONFIG_IP_PNP\u003dy\u003cbr /\u003e+CONFIG_IP_PNP_DHCP\u003dy\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Putting-it-all-together\" /\u003ePutting it all together\u003cbr /\u003e\u003c/h2\u003eYou are now ready to try out your new kernel. Just start up your target and type 'boot'.\u003cbr /\u003e\u003cbr /\u003eA partial boot trace is shown below to show the sequence of events:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eU-Boot 2010.09-00199-g4c814f0-dirty (Feb 14 2011 - 16:33:28)\u003cbr /\u003e\u003cbr /\u003eTEGRA2 \u003cbr /\u003eBoard:   Tegra2 Seaboard.developer\u003cbr /\u003eDRAM:  1 GiB\u003cbr /\u003eNAND:  0 MiB\u003cbr /\u003eSF: Detected W25Q16B with page size 256, total 2 MiB\u003cbr /\u003eIn:    tegra-kbc\u003cbr /\u003eOut:   lcd\u003cbr /\u003eErr:   lcd\u003cbr /\u003eNet:   No ethernet found.\u003cbr /\u003eHit any key to stop autoboot:  2\u003cbr /\u003eCrOS\u0026gt; boot\u003cbr /\u003e(Re)start USB...\u003cbr /\u003eUSB:   Tegra ehci init hccr c5008100 and hcor c5008140 hc_length 64\u003cbr /\u003eRegister 10011 NbrPorts 1\u003cbr /\u003eUSB EHCI 1.00\u003cbr /\u003escanning bus for devices... 5 USB Device(s) found\u003cbr /\u003e       scanning bus for storage devices... 1 Storage Device(s) found\u003cbr /\u003e       scanning bus for ethernet devices... 1 Ethernet Device(s) found\u003cbr /\u003eWaiting for Ethernet connection... done.\u003cbr /\u003eBOOTP broadcast 1\u003cbr /\u003eBOOTP broadcast 2\u003cbr /\u003e*** Unhandled DHCP Option in OFFER/ACK: 208\u003cbr /\u003e*** Unhandled DHCP Option in OFFER/ACK: 208\u003cbr /\u003eDHCP client bound to address 172.22.73.81\u003cbr /\u003eWaiting for Ethernet connection... done.\u003cbr /\u003eUsing asx0 device\u003cbr /\u003eTFTP from server 172.22.73.60; our IP address is 172.22.73.81\u003cbr /\u003eFilename '/tftpboot/uImage-sjg-seaboard-261347'.\u003cbr /\u003eLoad address: 0x40c000\u003cbr /\u003eLoading: #################################################################\u003cbr /\u003e     #################################################################\u003cbr /\u003e     #################################################################\u003cbr /\u003e     ###############################################\u003cbr /\u003edone\u003cbr /\u003eBytes transferred \u003d 3545596 (3619fc hex)\u003cbr /\u003e## Booting kernel from Legacy Image at 0040c000 ...\u003cbr /\u003e   Image Name:   Linux-2.6.37-00890-g3506cb6c-dir\u003cbr /\u003e   Image Type:   ARM Linux Kernel Image (uncompressed)\u003cbr /\u003e   Data Size:    3545532 Bytes \u003d 3.4 MiB\u003cbr /\u003e   Load Address: 00008000\u003cbr /\u003e   Entry Point:  00008000\u003cbr /\u003e   Verifying Checksum ... OK\u003cbr /\u003e   Loading Kernel Image ... OK\u003cbr /\u003eOK\u003cbr /\u003e\u003cbr /\u003eStarting kernel ...\u003cbr /\u003e\u003cbr /\u003eUncompressing Linux... done, booting the kernel.\u003cbr /\u003e[    0.000000] Initializing cgroup subsys cpuset\u003cbr /\u003e[    0.000000] Initializing cgroup subsys cpu\u003cbr /\u003e[    0.000000] Linux version 2.6.37-00890-g3506cb6c-dirty (sjg@kiwi.mtv.corp.google.com) (gcc version 4.4.3 (Gentoo Hardened 4.4.3-r4 p1.2, pie-0.4.1) ) #25 SMP PREEMPT Mon Feb 14 14:16:06 PST 2011\u003cbr /\u003e[    0.000000] CPU: ARMv7 Processor [411fc090] revision 0 (ARMv7), cr\u003d10c53c7f\u003cbr /\u003e[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache\u003cbr /\u003e[    0.000000] Machine: seaboard\u003cbr /\u003e[    0.000000] Ignoring unrecognised tag 0x54410008\u003cbr /\u003e[    0.000000] Memory policy: ECC disabled, Data cache writealloc\u003cbr /\u003e[    0.000000] PERCPU: Embedded 7 pages/cpu @c0f8a000 s7264 r8192 d13216 u32768\u003cbr /\u003e[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 227328\u003cbr /\u003e[    0.000000] Kernel command line: console\u003dttyS0,115200n8 lp0_vec\u003d0x2000@0x1C406000 mem\u003d384M@0M nvmem\u003d128M@384M mem\u003d512M@512M noinitrd dev\u003d/dev/nfs4 rw nfsroot\u003d172.22.73.60:/export/nfsroot-sjg-seaboard-261347 ip\u003ddhcp\u003cbr /\u003e[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)\u003cbr /\u003e\u003cbr /\u003e...\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e[   24.249981] usb 3-1.1: New USB device strings: Mfr\u003d1, Product\u003d2, SerialNumber\u003d3\u003cbr /\u003e[   24.249991] usb 3-1.1: Product: AX88x72A\u003cbr /\u003e[   24.249998] usb 3-1.1: Manufacturer: ASIX Elec. Corp.\u003cbr /\u003e[   24.250005] usb 3-1.1: SerialNumber: 000001\u003cbr /\u003e[   25.196440] asix 3-1.1:1.0: eth0: register 'asix' at usb-tegra-ehci.2-1.1, ASIX AX88772 USB 2.0 Ethernet, 68:7f:74:9f:f6:f2\u003cbr /\u003e[   25.303359] usb 3-1.2: new high speed USB device using tegra-ehci and address 4\u003cbr /\u003e\u003cbr /\u003e...\u003cbr /\u003e\u003cbr /\u003e[   25.845564] eth0: link down\u003cbr /\u003e[   25.854603] ADDRCONF(NETDEV_UP): eth0: link is not ready\u003cbr /\u003e\u003cbr /\u003e...\u003cbr /\u003e\u003cbr /\u003e[   26.863238] Sending DHCP requests .\u003cbr /\u003e[   27.198754] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready\u003cbr /\u003e[   27.206441] eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1\u003cbr /\u003e[   29.223214] ., OK\u003cbr /\u003e[   29.283223] IP-Config: Got DHCP answer from 172.24.11.52, my address is 172.22.73.81\u003cbr /\u003e[   29.292032] IP-Config: Complete:\u003cbr /\u003e[   29.295104]      device\u003deth0, addr\u003d172.22.73.81, mask\u003d255.255.252.0, gw\u003d172.22.75.254,\u003cbr /\u003e[   29.302952]      host\u003dseaboard0.mtv.corp.google.com, domain\u003dmtv.corp.google.com, nis-domain\u003d(none),\u003cbr /\u003e[   29.312000]      bootserver\u003d172.24.11.52, rootserver\u003d172.22.73.60, rootpath\u003d\u003cbr /\u003e[   29.319579] mount nfs, dev\u003d172.22.73.60:/export/nfsroot-sjg-seaboard-261347, flags\u003d32768, root_data\u003dnolock,addr\u003d172.22.73.60VFS: Mounted root (nfs filesystem) on device 0:16.\u003cbr /\u003e[   29.345192] mount nfs done\u003cbr /\u003e[   29.348171] devtmpfs: mounted\u003cbr /\u003e[   29.351372] Freeing init memory: 268K\u003cbr /\u003e[   29.357144] Not activating Mandatory Access Control now since /sbin/tomoyo-init doesn't exist.\u003cbr /\u003e[   29.956410] mount used greatest stack depth: 4884 bytes left\u003cbr /\u003e[   30.736770] ply-image used greatest stack depth: 4668 bytes left\u003cbr /\u003e[   31.070665] rm used greatest stack depth: 4620 bytes left\u003cbr /\u003e[   31.227262] mknod used greatest stack depth: 4388 bytes left\u003cbr /\u003e[   31.428835] chown used greatest stack depth: 4372 bytes left\u003cbr /\u003e[   31.673332] chown used greatest stack depth: 4292 bytes left\u003cbr /\u003e[   31.755995] unknown ioctl code\u003cbr /\u003e[   31.759218] NvRmIoctls_NvRmFbControl: deprecated \u003cbr /\u003eNVRM_DAEMON(1261): skipping Audi[   31.779495] nvrm_notifier_store: nvrm_daemon\u003d801\u003cbr /\u003eoFx initialization\u003cbr /\u003e[   31.792064] nvrm_notifier_show: blocking\u003cbr /\u003e[   31.852343] mkdir used greatest stack depth: 3956 bytes left\u003cbr /\u003eudevd[837]: unknown key 'HOTPLUG' in /etc/udev/rules.d/99-monitor-hotplug.rules:2\u003cbr /\u003e\u003cbr /\u003e[   32.327921] udevd (853): /proc/853/oom_adj is deprecated, please use /proc/853/oom_score_adj instead.\u003cbr /\u003e\u003cbr /\u003eDeveloper Console\u003cbr /\u003e\u003cbr /\u003eTo return to the browser, press:\u003cbr /\u003e\u003cbr /\u003e  [ Ctrl ] and [ Alt ] and [ F1 ]\u003cbr /\u003e\u003cbr /\u003eTo use this console, the developer mode switch must be engaged.\u003cbr /\u003eDoing so will destroy any saved data on the system.\u003cbr /\u003e\u003cbr /\u003eIn developer mode, it is possible to\u003cbr /\u003e- login and sudo as user 'chronos'\u003cbr /\u003e- require a password for sudo and login(*)\u003cbr /\u003e- disable power management behavior (screen dimming):\u003cbr /\u003e  sudo initctl stop powerd\u003cbr /\u003e- install your own operating system image!\u003cbr /\u003e\u003cbr /\u003e* To set a password for 'chronos', run the following as root:\u003cbr /\u003e\u003cbr /\u003eecho \"chronos:$(openssl passwd -1)\" \u0026gt; /mnt/stateful_partition/etc/devmode.passwd\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003eHave fun and send patches!\u003cbr /\u003e\u003cbr /\u003elocalhost login: \u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003eTODO: Troubleshooting?\u003c/font\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-NFS-Caveats\" /\u003eNFS Caveats\u003c/h3\u003e\u003cdiv\u003eSome things to be aware of:\u003c/div\u003e\u003cul\u003e\u003cli\u003eIf your network goes down, so does your mount. If you are using NFS root on eth0, then typing \u003ccode\u003eifconfig eth0 down\u003c/code\u003e will lock your target since the root filesystem goes away. Recovery is via a reboot\u003c/li\u003e\u003cli\u003eIf the kernel cannot find the NFS server, or has a permissions problem, your kernel will not boot\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/network-based-development"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6240228859543216111"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/457899783549421505/1"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6240228859543216111"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6240228859543216111"}],"author":[{"name":{"$t":"Simon Glass"},"email":{"$t":"sjg@chromium.org"}}],"sites$pageName":{"$t":"network-based-development"},"sites$revision":{"$t":"35"}},{"gd$etag":"\"WCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6260545720796713367"},"published":{"$t":"2011-02-16T19:16:53.351Z"},"updated":{"$t":"2018-06-26T22:51:06.788Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-26T22:51:05.042Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium Style Checker Errors"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Constructor-Destructor-Errors\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eConstructor/Destructor Errors\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Virtual-Method-Out-of-lining\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eVirtual Method Out-of-lining\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Virtual-methods-and-override-final\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eVirtual methods and override/final\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Redundant-Virtual-specifiers\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eRedundant Virtual specifiers\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Virtual-final-base-class-methods\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eVirtual final base class methods\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-namespace-in-a-header\"\u003e\u003cstrong\u003e7 \u003c/strong\u003e\"Using namespace\" in a header\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-RefCounted-types-with-public-destructors\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eRefCounted types with public destructors\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Enumerator-max-values\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eEnumerator max values\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003eDue to constant over inlining, we now have plugins to the clang compiler which check for certain patterns that can increase code bloat. This document lists these errors, explains the motivation behind adding it as an error and shows how to fix them. The \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang_format_binaries.md\"\u003echromium/clang wiki page\u003c/a\u003e explains how you can run the plugin yourself, or how you can run your CLs through the clang trybots which run this plugin as well.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAll diagnostics produced by the style checker are marked with \u003cfont face\u003d\"'courier new', monospace\"\u003e[chromium-style]\u003c/font\u003e.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Constructor-Destructor-Errors\" /\u003eConstructor/Destructor Errors\u003c/h2\u003e\u003cdiv\u003eConstructors and destructors are often much larger and more complex than programmers think. They are also implicitly defined in each translation unit if you don't declare them. This can have a cascading effect if a class has member variables that have inlined/implicitly declared constructors/destructors, or are templates.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e(Internally, the plugin determines whether a class is complex using a point system, adding 9 points for each templated base class, 10 for each templated member variable, 3 for each non-POD type member variable, and (only for the constructor score) 1 for each integral data type. If a class's score is greater than or equal to 10, it will trip these errors.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you get any of these compiler errors:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eComplex class/struct needs an explicit out-of-line constructor\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eComplex class/struct needs an explicit out-of-line destructor\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIt's because you've written something like the following in a header:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass ComplexStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  void NoDeclaredConstructor();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e private:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  // Enough data members to trip the detector\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  BigObject big_object_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  std::map\u0026lt;std::string, OtherObj\u0026gt; complex_stl_stuff_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis is fixed by adding declared constructors:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eclass ComplexStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  // Defined in the cc file:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  ComplexStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  ~ComplexStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e private:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(56,118,29)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cfont color\u003d\"#990000\" style\u003d\"color:rgb(0,0,0)\"\u003e  \u003c/font\u003e\u003cfont\u003eBigObject big_object_;\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(56,118,29)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  std::map\u0026lt;std::string, OtherObj\u0026gt; complex_stl_stuff_;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eLikewise, if you get these compiler errors:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eComplex constructor has an inlined body.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eComplex destructor has an inline body.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIt's because you've written something like the following in a header:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass MoreComplexStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e public:\u003cbr /\u003e  MoreComplexStuff() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  ~MoreComplexStuff() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e private:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  BigObject big_object_;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  std::map\u0026lt;std::string, OtherObj\u0026gt; complex_stl_stuff_;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe solution is the same; put the definitions for the constructor/destructor in the implementation file.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSometimes, you might need to inline a constructor/destructor for performance reasons. The style checker makes an exception for explicitly inlined constructors/destructors:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .h file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    class ComplexFastStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ComplexFastStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ~ComplexFastStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     private:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      /* complicated members */\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    };\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .cc file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    inline ComplexFastStuff::ComplexFastStuff() {\u003cbr /\u003e    }\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    inline ComplexFastStuff::~ComplexFastStuff() {\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    }\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont style\u003d\"font-size:13.3333px\"\u003eIf this class is being copied somewhere in the code, then the compiler will generate an implicit copy constructor for the class. As a result, you might also see the following error:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eComplex class/struct needs an explicit out-of-line copy constructor.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eThis can be fixed by adding an explicit copy constructor to your class: \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .h file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    class ComplexCopyableStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ComplexCopyableStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ComplexCopyableStuff(const ComplexCopyableStuff\u0026amp; other);\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ~ComplexCopyableStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     private:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      /* complicated members */\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    };\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .cc file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    ComplexCopyableStuff::ComplexCopyableStuff(const ComplexCopyableStuff\u0026amp; other) \u003d default;\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eNote that by defaulting the implementation, you ensure that you don't forget to copy a member and this code will not need to be updated as the members of the class change.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eAlso note that copying a complex class can be an expensive operation. The preferred solution is almost always is to avoid the copy if possible. Please consider changing the code and eliminating unnecessary copies instead of simply adding an out of line copy constructor to silence the error. Additionally, in a large number of cases, you can utilize move semantics to improve the efficiency of the code.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eUsually a compiler would generate a move constructor for your class, making moving objects efficient. This is particularly true for STL containers such as std::map. However, specifying either a copy constructor or a destructor prevents the compiler from generating a move constructor. All in all, you should prefer specifying a move constructor instead of a copy constructor. In cases where your object is used as an rvalue, this will also prevent the error since the compiler will not generate a copy constructor:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .h file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    class ComplexMovableStuff {\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      Complex\u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:courier new,monospace;font-size:13.3333px\"\u003eMovable\u003c/span\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      Complex\u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:courier new,monospace;font-size:13.3333px\"\u003eMovable\u003c/span\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eStuff(ComplexMovableStuff\u0026amp;\u0026amp; other);\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      ~ComplexMovableStuff();\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e     private:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e      /* complicated members */\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    };\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    // In the .cc file:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e    ComplexMovableStuff::ComplexMovableStuff(ComplexMovableStuff\u0026amp;\u0026amp; other) \u003d default;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#0b5394\"\u003e\u003cspan\u003e   \u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eFor more information on move semantics, please refer to \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/rvalue-references\"\u003ehttps://sites.google.com/a/chromium.org/dev/rvalue-references\u003c/a\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Virtual-Method-Out-of-lining\" /\u003eVirtual Method Out-of-lining\u003c/h2\u003e\u003cdiv\u003eVirtual methods are almost never inlined in practice. Because of this, methods on a base class will be emitted in each translation unit that allocates the object or any subclasses that don't override that method. This is usually not a major gain, unless you have a wide class hierarchy in which case it can be a big win (\u003ca href\u003d\"http://codereview.chromium.org/5741001/\"\u003ehttp://codereview.chromium.org/5741001/\u003c/a\u003e). Since virtual methods will almost never be inlined anyway (because they'll need to go through vtable dispatch), there are almost no downsides.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you get the error:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003evirtual methods with non-empty bodies shouldn't be declared inline\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIt's because you wrote something like this:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  virtual void ThisOneIsOK() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  virtual bool ButWeDrawTheLineAtMethodsWithRealImplementation() { return false; }\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cbr /\u003e\u003cdiv\u003eAnd can be fixed by out of lining the method that does work:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  virtual void ThisIsHandledByTheCompiler() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  virtual bool AndThisOneIsDefinedInTheImplementation();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Virtual-methods-and-override-final\" /\u003eVirtual methods and override/final\u003c/h2\u003e\u003cdiv\u003eIf you get the error:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eOverriding method must be marked with 'override' or 'final'.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eIt is because you are overriding a base class method, yet not annotating that override with override or final. For example:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual ~BaseClass() {}\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual void SomeMethod() \u003d 0;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass DerivedClass : public BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual void SomeMethod();\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont color\u003d\"#990000\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003eThe solution? Just tell the compiler what you intend:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003e[...]\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass DerivedClass : public BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  void SomeMethod() \u003cb\u003eoverride\u003c/b\u003e;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis allows the compiler to warn you when your intentions stop matching parsed reality.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Redundant-Virtual-specifiers\" /\u003eRedundant Virtual specifiers\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eIf you get one of the following errors:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont color\u003d\"#073763\"\u003e'virtual' is redundant; 'override' implies 'virtual'\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont color\u003d\"#073763\"\u003e'virtual' is redundant; 'final' implies 'virtual'\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont color\u003d\"#073763\"\u003e'override' is redundant; 'final' implies 'override'\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eJust remove the redundant specifier. Google style is to use only one of virtual, override, or final per method. For example:\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"font-size:13.3333330154419px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual void SomeMethod() \u003d 0;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass DerivedClass : public BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual void SomeMethod() override final;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003eCan be simply written:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"font-size:13.3333330154419px;margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003e[...]\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass DerivedClass : public BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  void SomeMethod() final;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Virtual-final-base-class-methods\" /\u003eVirtual final base class methods\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eIf you get the error:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eThe virtual method does not override anything and is final; consider making it non-virtual\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThat means you have a final method that's not overriding anything. In that case, consider removing the virtual keyword, since no one can override the method anyway. For example:\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  virtual void SomeMethod() final;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\" /\u003e\u003c/div\u003e\u003cdiv\u003eShould be written:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eclass BaseClass {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  void SomeMethod();\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px\"\u003e\u003cdiv style\u003d\"font-size:13.3333330154419px;color:rgb(153,0,0)\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-namespace-in-a-header\" /\u003e\"Using namespace\" in a header\u003c/h2\u003e\u003cdiv\u003eYou should never have using namespace directives in a header because this can change the lookup rules in unrelated implementation files.\u003c/div\u003e\u003cdiv\u003eThis is enforced by clang's -Wheader-hygiene warning. This isn't checked by the style plugin.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you get the error:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eusing namespace directive in global context in header [-Wheader-hygiene]\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003eIt's because you did something like this in a header:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eusing namespace WebKit;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass OurDerivedClass : public WebKitType {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont color\u003d\"#990000\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003eYou can fix this by removing the \"using namespace\" line and explicitly stating the namespace:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eclass OurDerivedClass : public WebKit::WebKitType {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-RefCounted-types-with-public-destructors\" /\u003eRefCounted types with public destructors\u003c/h2\u003e\u003cdiv\u003eWhen you declare a type to be referenced counted by making it derive from base::RefCounted or base::RefCountedThreadSafe, you're indicating that it should not be destructed until the last reference is Released, either explicitly or by destructing a scoped_refptr\u0026lt;\u0026gt;. Having a public destructor allows this contract to be violated, by allowing callers to stack allocate the object, store it in a scoped_ptr\u0026lt;\u0026gt; instead of a scoped_refptr\u0026lt;\u0026gt;, or to explicitly delete the object before all references have gone away. Because this can lead to subtle security bugs, the style checker will warn if class that is derived from a RefCounted type has either an explicit public destructor or an implicit destructor, which is automatically public.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you get the error:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eClasses that are ref-counted should not have public destructors.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIt's because you did something like this:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass Foo : public base::RefCounted\u0026lt;Foo\u0026gt; {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  Foo() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  ~Foo() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003eYou can fix this by ensuring that the destructor is either protected (if expecting classes to subclass this base) or private. You'll also need to ensure that the RefCounted type is friended, as appropriate.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eclass Foo : public base::RefCounted\u0026lt;Foo\u0026gt; {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e public:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  Foo() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e private:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  friend class base::RefCounted\u0026lt;Foo\u0026gt;;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  ~Foo() {}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003eIf you get the error:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\"\u003eClasses that are ref-counted should have explicit destructors that are protected or private.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eIt's because you did something like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eclass Foo : public base::RefCounted\u0026lt;Foo\u0026gt; {\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  // Compiler generated constructors, destructor, and copy operator are public.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou can fix it by ensuring you explicitly declare a protected or private destructor:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003eclass Foo : public base::RefCounted\u0026lt;Foo\u0026gt; {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e // Compiler generated constructors and copy operator are public.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e private:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  friend class base::RefCounted\u0026lt;Foo\u0026gt;;\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e  ~Foo() {}  // Explicit destructor is private.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Enumerator-max-values\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eEnumerator max values\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf you have an enumerator value that needs to be the max value (useful for histograms or for IPC), declare your enum as an enum class and name the max value \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003ekMaxValue\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. The plugin will automatically warn if \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003ekMaxValue\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e is no longer the max value.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFor example:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003eenum class Foo {\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  kOne,\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  kTwo,\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e  kMaxValue \u003d kOne,\u003cbr /\u003e};\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eWill produce the error:\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont color\u003d\"#0b5394\" face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003ekMaxValue enumerator does not match max value 0 of other enumerators\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThis can be fixed by assigning the correct value to \u003c/font\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"courier new, monospace\"\u003ekMaxValue\u003c/font\u003e\u003cfont color\u003d\"#0b5394\" face\u003d\"arial, sans-serif\"\u003e:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#0b5394\" face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eenum class Foo {\u003cbr /\u003e\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  kOne,\u003cbr /\u003e\u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e  kTwo,\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent;font-size:10pt\"\u003e  kMaxValue \u003d kTwo,\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e};\u003c/font\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1724331143067532806"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/coding-style/chromium-style-checker-errors"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6260545720796713367"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6260545720796713367"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6260545720796713367"}],"author":[{"name":{"$t":"Elliot Glaysher"},"email":{"$t":"erg@chromium.org"}}],"sites$pageName":{"$t":"chromium-style-checker-errors"},"sites$revision":{"$t":"21"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7119677774298208325"},"published":{"$t":"2016-03-28T22:13:59.794Z"},"updated":{"$t":"2018-06-26T01:49:36.921Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-26T01:49:34.997Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"ScopedLogger"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-This-page-moved-to-third_party-blink-renderer-platform-wtf-ScopedLogger.md.\" /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-weight:normal\"\u003eThis page moved to \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px;font-weight:normal\"\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/platform/wtf/ScopedLogger.md\" target\u003d\"_blank\"\u003ethird_party/blink/renderer/platform/wtf/ScopedLogger.md\u003c/a\u003e.\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/scopedlogger"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7119677774298208325"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7119677774298208325"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7119677774298208325"}],"author":[{"name":{"$t":"Steve Kobes"},"email":{"$t":"skobes@chromium.org"}}],"sites$pageName":{"$t":"scopedlogger"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"Xil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1998897687188888744"},"published":{"$t":"2014-02-21T00:49:23.248Z"},"updated":{"$t":"2018-06-26T01:48:28.429Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-26T01:48:26.298Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"IDL compiler"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003eThis documentation has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLCompiler.md\" target\u003d\"_blank\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLCompiler.md\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/idl-compiler"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1998897687188888744"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1998897687188888744"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1998897687188888744"}],"author":[{"name":{"$t":"Nils Barth"},"email":{"$t":"nbarth@chromium.org"}}],"sites$pageName":{"$t":"idl-compiler"},"sites$revision":{"$t":"37"}},{"gd$etag":"\"WCl7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4247162851563847597"},"published":{"$t":"2015-08-20T20:48:34.980Z"},"updated":{"$t":"2018-06-26T00:35:02.425Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-26T00:35:00.782Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Go in Chromium OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recommended-organization-of-code-for-Go-projects-in-Chromium-OS\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eRecommended organization of code for Go projects in Chromium OS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recommendations-for-local-development-and-builds\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eRecommendations for local development and builds\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Setting-up-ebuilds-for-third-party-Go-packages\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSetting up ebuilds for third party Go packages\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Setting-up-ebuilds-for-Chromium-OS-Go-projects\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eSetting up ebuilds for Chromium OS Go projects\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Location-of-ebuilds-and-repositories\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eLocation of ebuilds and repositories\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Useful-functions-and-variables\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eUseful functions and variables\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\nThis page provides information on using \u003ca href\u003d\"https://golang.org\"\u003eGo\u003c/a\u003e in Chromium OS, including recommendations for project organization, importing and managing third party packages, and writing ebuilds.\r\n\u003cbr /\u003e\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Recommended-organization-of-code-for-Go-projects-in-Chromium-OS\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eRecommended organization of code for Go projects in Chromium OS\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\r\nProjects should generally follow the official recommendation to organize their Go workspaces: \u003ca href\u003d\"https://golang.org/doc/code.html\"\u003egolang.org/doc/code.html\u003c/a\u003e\r\n\u003cbr /\u003e\r\nThese are some additional recommendations and naming conventions for organizing Go project workspaces in Chromium OS:\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tIf the Go project is in its own git repository, it should be set up such that the root of the repository is a workspace.\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eIt should have a single directory path \u003ccode\u003e\"src/\u0026lt;project name\u0026gt;/\"\u003c/code\u003e at the top level of the repository.\u003c/li\u003e\r\n\t\t\u003cli\u003eThis way, import paths for packages in the project always begin with \u003ccode\u003e\"\u0026lt;project name\u0026gt;/\"\u003c/code\u003e.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003cbr /\u003e\r\n\t\u003c/li\u003e\r\n\r\n\t\u003cli\u003e\r\n\tIf the project provides useful Go library packages for other projects to import, put all such packages under \u003ccode\u003e\"src/chromiumos/\"\u003c/code\u003e.\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eThis way, import paths for Chromium OS specific common Go packages always begin with \u003ccode\u003e\"chromiumos/\"\u003c/code\u003e prefix.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003cbr /\u003e\r\n\t\u003c/li\u003e\r\n\r\n\t\u003cli\u003e\r\n\tWhen adding Go code to an existing project already containing code in other languages, create a top level directory called \u003ccode\u003e\"go\"\u003c/code\u003e in the repository and use that as the Go workspace.\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eFollow the rest of the recommendation for new projects above (e.g. all code should be under \u003ccode\u003e\"go/src/\u0026lt;project\u0026gt;/\"\u003c/code\u003e or \u003ccode\u003e\"go/src/chromiumos/\"\u003c/code\u003e).\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003cbr /\u003e\r\n\t\u003c/li\u003e\r\n\r\n\t\u003cli\u003e\r\n\t\u003cb\u003eIMPORTANT:\u003c/b\u003e Do not use \u003ccode\u003e\"go get\"\u003c/code\u003e or vendor third party packages to individual project repositories.\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eInstead, write an ebuild (in \u003ccode\u003echromiumos-overlay/dev-go\u003c/code\u003e) that installs the third party packages to \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Recommendations-for-local-development-and-builds\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eRecommendations for local development and builds\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\r\nSet the \u003ca href\u003d\"https://golang.org/cmd/go/#hdr-GOPATH_environment_variable\"\u003eGOPATH environment variable\u003c/a\u003e to contain two elements:\r\n\u003col\u003e\r\n\t\u003cli\u003ePath to the local Go workspace (directory containing \u003ccode\u003e\"src/\u0026lt;project\u0026gt;/\"\u003c/code\u003e).\u003c/li\u003e\r\n\t\u003cli\u003ePath to all locally installed (emerged) Go packages: \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\r\nWhen compiling for host, invoke the Go command as \u003ccode\u003e\"x86_64-pc-linux-gnu-go\"\u003c/code\u003e, or simply, \u003ccode\u003e\"go\"\u003c/code\u003e.\r\n\u003cul\u003e\r\n\t\u003cli\u003eThe host compiler is included in the chromiumos-sdk (\u003ccode\u003ecros_sdk\u003c/code\u003e) and is installed automatically when a chroot is created.\u003c/li\u003e\r\n\t\u003cli\u003e\r\n\tA few useful utilities like \u003ccode\u003e\"gofmt\"\u003c/code\u003e, \u003ccode\u003e\"godoc\"\u003c/code\u003e, \u003ccode\u003e\"golint\"\u003c/code\u003e, and \u003ccode\u003e\"goguru\"\u003c/code\u003e are also in the SDK and installed in the chroot.\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003e\u003ccode\u003e\"repo upload\"\u003c/code\u003e is configured to warn when trying to upload a change containing any Go files not formatted with \u003ccode\u003egofmt\u003c/code\u003e.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\nGo cross compiler for a board is installed automatically when \u003ccode\u003e\"setup_board\"\u003c/code\u003e is run in the chroot.\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tThe cross-compiling Go command is determined by the toolchain target tuple for the board:\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eUse \u003ccode\u003e\"x86_64-cros-linux-gnu-go\"\u003c/code\u003e for \u003ccode\u003eamd64\u003c/code\u003e targets.\u003c/li\u003e\r\n\t\t\u003cli\u003eUse \u003ccode\u003e\"armv7a-cros-linux-gnueabi-go\"\u003c/code\u003e for \u003ccode\u003earm\u003c/code\u003e targets.\u003c/li\u003e\r\n\t\t\u003cli\u003eUse \u003ccode\u003e\"aarch64-cros-linux-gnu-go\"\u003c/code\u003e for \u003ccode\u003earm64\u003c/code\u003e targets.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003eThe cross compilers are configured to enable full Cgo support (i.e. they automatically use the correct cross-clang for compiling the C parts).\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-ebuilds-for-third-party-Go-packages\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eSetting up ebuilds for third party Go packages\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\r\nWrite an ebuild to fetch and install third party packages to \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tIf the upstream repository has tagged releases, use the ebuild version to fetch and install the corresponding release. Example: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/errors\"\u003edev-go/errors\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_GO_SOURCE\u003d\"github.com/pkg/errors v${PV}\"\r\n\r\nCROS_GO_PACKAGES\u003d(\r\n\t\"github.com/pkg/errors\"\r\n)\r\n\r\ninherit cros-go\r\n\r\nDESCRIPTION\u003d\"Error handling primitives for Go.\"\r\nHOMEPAGE\u003d\"https://github.com/pkg/errors\"\r\nSRC_URI\u003d\"$(cros-go_src_uri)\"\r\n\r\nLICENSE\u003d\"BSD\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003e\r\n\tIf the upstream repository does not have release tags, keep the ebuild version at \u003ccode\u003e0.0.1\u003c/code\u003e and manage the commit hash manually. Example: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/glog/glog-0.0.1.ebuild\"\u003edev-go/glog\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_GO_SOURCE\u003d\"github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed\"\r\n\r\nCROS_GO_PACKAGES\u003d(\r\n\t\"github.com/golang/glog\"\r\n)\r\n\r\ninherit cros-go\r\n\r\nDESCRIPTION\u003d\"Leveled execution logs for Go\"\r\nHOMEPAGE\u003d\"https://github.com/golang/glog\"\r\nSRC_URI\u003d\"$(cros-go_src_uri)\"\r\n\r\nLICENSE\u003d\"BSD-Google\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003e\r\n\tIf the canonical import path is different from the repository path, specify it along with the repository path. Example: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/go-sys/go-sys-0.0.1.ebuild\"\u003edev-go/go-sys\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_GO_SOURCE\u003d\"go.googlesource.com/sys:golang.org/x/sys a646d33e2ee3172a661fc09bca23bb4889a41bc8\"\r\n\r\nCROS_GO_PACKAGES\u003d(\r\n\t\"golang.org/x/sys/unix\"\r\n)\r\n\r\ninherit cros-go\r\n\r\nDESCRIPTION\u003d\"Go packages for low-level interaction with the operating system\"\r\nHOMEPAGE\u003d\"https://golang.org/x/sys\"\r\nSRC_URI\u003d\"$(cros-go_src_uri)\"\r\n\r\nLICENSE\u003d\"BSD-Google\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003eInherit eclass \u003ccode\u003e\"cros-go\"\u003c/code\u003e.\r\n\t\u003c/li\u003e\u003cli\u003eUse \u003ccode\u003eCROS_GO_SOURCE\u003c/code\u003e to specify the source repo, commit-id, and optionally, an alternate import path.\u003c/li\u003e\r\n\t\u003cli\u003eUse \u003ccode\u003eCROS_GO_PACKAGES\u003c/code\u003e to list the packages to install.\u003c/li\u003e\r\n\t\u003cli\u003eThe installed packages can now be imported using their usual import paths, i.e. \u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eimport \"golang.org/x/sys/unix\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\u003c/li\u003e\r\n\t\u003cli\u003eUse \u003ccode\u003ecros-go_src_uri()\u003c/code\u003e to construct a valid \u003ccode\u003eSRC_URI\u003c/code\u003e.\u003c/li\u003e\r\n\t\u003cli\u003eThe first time this ebuild is emerged, Portage will complain that the distfile could not be downloaded from gentoo-mirror or chromeos-localmirror.\r\n\t This is expected, since we configure Portage to only look in the mirror locations and never download directly from \u003ccode\u003eSRC_URI\u003c/code\u003e.\r\n\t The \u003ccode\u003ecros-go.eclass\u003c/code\u003e will automatically print a helpful list of commands for downloading the distfile and adding it to chromeos-localmirror:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt; Emerging (1 of 1) dev-go/errors-0.8.0::chromiumos\r\n!!! Fetched file: github.com-pkg-errors-v0.8.0.tar.gz VERIFY FAILED!\r\n!!! Reason: Insufficient data for checksum verification\r\n!!! Got:\r\n!!! Expected: MD5 RMD160 SHA1 SHA256 SHA512 WHIRLPOOL\r\n * Fetch failed for 'dev-go/errors-0.8.0', Log file:\r\n * '/var/log/portage/dev-go:errors-0.8.0:20180518-202435.log'\r\n * Run these commands to add github.com-pkg-errors-v0.8.0.tar.gz to chromeos-localmirror:\r\n * wget -O github.com-pkg-errors-v0.8.0.tar.gz https://github.com/pkg/errors/archive/v0.8.0.tar.gz\r\n * gsutil cp -a public-read github.com-pkg-errors-v0.8.0.tar.gz gs://chromeos-localmirror/distfiles/\r\n * and update the 'Manifest' file with:\r\n * ebuild /mnt/host/source/src/third_party/chromiumos-overlay/dev-go/errors/errors-0.8.0.ebuild manifest\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t Run the suggested \u003ccode\u003ewget\u003c/code\u003e, \u003ccode\u003egsutil\u003c/code\u003e, and \u003ccode\u003eebuild\u003c/code\u003e commands, and then try the emerge again.\r\n\t For more information on \u003ccode\u003echromeos-localmirror\u003c/code\u003e and setting up \u003ccode\u003egsutil\u003c/code\u003e, \u003ca href\u003d\"https://sites.google.com/a/google.com/chromeos/resources/engineering/releng/localmirror\" rel\u003d\"nofollow\"\u003eread this\u003c/a\u003e.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-ebuilds-for-Chromium-OS-Go-projects\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eSetting up ebuilds for Chromium OS Go projects\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\r\n\u003cb\u003eIMPORTANT:\u003c/b\u003e Never use \u003ccode\u003e\"go get\"\u003c/code\u003e from an ebuild. Instead, write ebuilds for external dependencies and let Portage make them available under \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\r\nIf a project is only providing common \u003ccode\u003e\"chromiumos/\"\u003c/code\u003e Go packages for use by other projects, its ebuild only needs to fetch and install the package files to \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tExample: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/seccomp/seccomp-9999.ebuild\"\u003edev-go/seccomp\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_WORKON_PROJECT\u003d\"chromiumos/platform/go-seccomp\"\r\nCROS_WORKON_LOCALNAME\u003d\"../platform/go-seccomp\"\r\n\r\nCROS_GO_PACKAGES\u003d(\r\n\t\"chromiumos/seccomp\"\r\n)\r\n\r\ninherit cros-workon cros-go\r\n\r\nDESCRIPTION\u003d\"Go support for Chromium OS Seccomp-BPF policy files\"\r\nHOMEPAGE\u003d\"https://chromium.org/chromium-os/developer-guide/chromium-os-sandboxing\"\r\n\r\nLICENSE\u003d\"BSD-Google\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"~*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eThe seccomp package is located in \u003ccode\u003e\"chromiumos/platform/go-seccomp\"\u003c/code\u003e repo at \u003ccode\u003e\"src/chromiumos/seccomp/\"\u003c/code\u003e.\u003c/li\u003e\r\n\t\t\u003cli\u003eThis package can now be imported by other projects using \u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eimport \"chromiumos/seccomp\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003eNote that a single ebuild can install multiple related packages inside \u003ccode\u003e\"/usr/lib/gopath/src/chromiumos/...\"\u003c/code\u003e.\u003c/li\u003e\r\n\t\u003cli\u003eAlso, multiple ebuilds can install packages inside \u003ccode\u003e\"/usr/lib/gopath/src/chromiumos/...\"\u003c/code\u003e as long as there's no conflict for package paths.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\nFor a typical Go project that needs to build and install executables:\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tExample: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/golint/golint-0.0.1.ebuild\"\u003edev-go/golint\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_GO_SOURCE\u003d\"github.com/golang/lint c5fb716d6688a859aae56d26d3e6070808df29f7\"\r\n\r\nCROS_GO_BINARIES\u003d(\r\n\t\"github.com/golang/lint/golint\"\r\n)\r\n\r\ninherit cros-go\r\n\r\nDESCRIPTION\u003d\"A linter for Go source code\"\r\nHOMEPAGE\u003d\"https://github.com/golang/lint\"\r\nSRC_URI\u003d\"$(cros-go_src_uri)\"\r\n\r\nLICENSE\u003d\"BSD-Google\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"dev-go/go-tools\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/li\u003e\r\n\t\u003cli\u003eIf the project needs to import packages from outside its own repository, list those dependencies in the \u003ccode\u003eDEPEND\u003c/code\u003e variable.\u003c/li\u003e\r\n\t\u003cli\u003eAlways specify the binaries using \u003ccode\u003e\"CROS_GO_BINARIES\"\u003c/code\u003e variable. This will pick the correct compiler for cross-compiling, and invoke it with appropriate \u003ccode\u003eGOPATH\u003c/code\u003e and flags.\r\n\t (e.g. \u003ccode\u003e\"emerge-daisy\"\u003c/code\u003e will automatically use the arm cross-compiler, import packages from \u003ccode\u003e\"/build/daisy/usr/lib/gopath\"\u003c/code\u003e, and build PIE binaries).\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\nA single ebuild can install executable binaries, as well as provide Go packages for other projects to import.\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\tExample: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/dev-go/go-tools/go-tools-0.0.1.ebuild\"\u003edev-go/go-tools\u003c/a\u003e\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# Copyright 2018 The Chromium OS Authors. All rights reserved.\r\n# Distributed under the terms of the GNU General Public License v2.\r\n\r\nEAPI\u003d\"6\"\r\n\r\nCROS_GO_SOURCE\u003d\"go.googlesource.com/tools:golang.org/x/tools 2d19ab38faf14664c76088411c21bf4fafea960b\"\r\n\r\nCROS_GO_PACKAGES\u003d(\r\n\t\"golang.org/x/tools/go/gcimporter15\"\r\n\t\"golang.org/x/tools/go/gcexportdata\"\r\n)\r\n\r\nCROS_GO_TEST\u003d(\r\n\t\"${CROS_GO_PACKAGES[@]}\"\r\n)\r\n\r\nCROS_GO_BINARIES\u003d(\r\n\t\"golang.org/x/tools/cmd/godoc\"\r\n\t\"golang.org/x/tools/cmd/guru:goguru\"\r\n)\r\n\r\ninherit cros-go\r\n\r\nDESCRIPTION\u003d\"Packages and tools that support the Go programming language\"\r\nHOMEPAGE\u003d\"https://golang.org/x/tools\"\r\nSRC_URI\u003d\"$(cros-go_src_uri)\"\r\n\r\nLICENSE\u003d\"BSD-Google\"\r\nSLOT\u003d\"0\"\r\nKEYWORDS\u003d\"*\"\r\nIUSE\u003d\"\"\r\nRESTRICT\u003d\"binchecks strip\"\r\n\r\nDEPEND\u003d\"\"\r\nRDEPEND\u003d\"\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eThis builds and installs the \u003ccode\u003e\"godoc\"\u003c/code\u003e and \u003ccode\u003e\"goguru\"\u003c/code\u003e tools.\r\n\t\t It also provides packages \u003ccode\u003e\"golang.org/x/tools/go/gcimporter15\"\u003c/code\u003e and \u003ccode\u003e\"golang.org/x/tools/go/gcexportdata\"\u003c/code\u003e required to build \u003ccode\u003e\"dev-go/golint\"\u003c/code\u003e above.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\t\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Location-of-ebuilds-and-repositories\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eLocation of ebuilds and repositories\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\u003cul\u003e\r\n\t\u003cli\u003eEbuilds for third party Go packages and tools should go in \u003ccode\u003echromiumos-overlay/dev-go\u003c/code\u003e.\u003c/li\u003e\r\n\t\u003cli\u003eEbuilds for Chromium OS specific common Go packages (import paths beginning with \u003ccode\u003e\"chromiumos/\"\u003c/code\u003e) should also go to \u003ccode\u003echromiumos-overlay/dev-go\u003c/code\u003e. Their repositories should go to an appropriate place in the tree (e.g. \"\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/platform/go-seccomp\"\u003echromium.googlesource.com/chromiumos/platform/go-seccomp\u003c/a\u003e\").\u003c/li\u003e\r\n\t\u003cli\u003eFor other Chromium OS Go projects, use \u003ccode\u003echromiumos-overlay/dev-go\u003c/code\u003e only if it's a generic helper tool or utility for development. Otherwise, pick a more appropriate category and overlay for the project.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Useful-functions-and-variables\" /\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eUseful functions and variables\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\r\n\r\nThe cros-go eclass is defined here: \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/cros-go.eclass\"\u003echromiumos-overlay/eclass/cros-go.eclass\u003c/a\u003e\r\n\u003cdl\u003e\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_SOURCE\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tPath to the upstream repository and commit id. Go repositories on \u003ccode\u003e\"github.com\"\u003c/code\u003e and \u003ccode\u003e\"*.googlesource.com\"\u003c/code\u003e are supported.\r\n\tThe source string contains the path of the git repository containing Go packages, and a commit-id (or version tag).\u003cbr /\u003e\r\n\tFor example:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_SOURCE\u003d\"github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill fetch the sources from \u003ca href\u003d\"https://github.com/golang/glog\" rel\u003d\"nofollow\"\u003egithub.com/golang/glog\u003c/a\u003e at the specified commit-id, and\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_SOURCE\u003d\"github.com/pkg/errors v0.8.0\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill fetch the sources from \u003ca href\u003d\"https://github.com/pkg/errors\" rel\u003d\"nofollow\"\u003egithub.com/pkg/errors\u003c/a\u003e at version \u003ccode\u003ev0.8.0\u003c/code\u003e.\u003cbr /\u003e\r\n\tBy default, the import path for Go packages in the repository is the same as repository path. This can be overridden by appending a colon to the repository path, followed by an alternate import path.\u003cbr /\u003e\r\n\tFor example:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_SOURCE\u003d\"github.com/go-yaml/yaml:gopkg.in/yaml.v2 v2.2.1\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill fetch the sources from \u003ca href\u003d\"https://github.com/go-yaml/yaml\" rel\u003d\"nofollow\"\u003egithub.com/go-yaml/yaml\u003c/a\u003e at the version \u003ccode\u003ev2.2.1\u003c/code\u003e, and install the package under \u003ccode\u003e\"gopkg.in/yaml.v2\"\u003c/code\u003e.\u003cbr /\u003e\r\n\t\u003ccode\u003eCROS_GO_SOURCE\u003c/code\u003e can contain multiple items when defined as an array:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_SOURCE\u003d(\r\n\t\"github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed\"\r\n\t\"github.com/pkg/errors v0.8.0\"\r\n\t\"github.com/go-yaml/yaml:gopkg.in/yaml.v2 v2.2.1\"\r\n)\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_WORKSPACE\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tPath to the Go workspace, default is \u003ccode\u003e\"${S}\"\u003c/code\u003e. The Go workspace is searched for packages to build and install.\r\n\tIf all Go packages in the repository are under \u003ccode\u003e\"go/src/\"\u003c/code\u003e:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_WORKSPACE\u003d\"${S}/go\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003ccode\u003eCROS_GO_WORKSPACE\u003c/code\u003e can contain multiple items when defined as an array:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_WORKSPACE\u003d(\r\n\t\"${S}\"\r\n\t\"${S}/tast-base\"\r\n)\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_BINARIES\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tGo executable binaries to build and install.\r\n\tEach path must contain a \u003ccode\u003epackage \"main\"\u003c/code\u003e. The last component of the package path will become the name of the executable.\r\n\tThe executable name can be overridden by appending a colon to the package path, followed by an alternate name.\r\n\tThe install path for an executable can be overridden by appending a colon to the package path, followed by the desired install path/name for it.\u003cbr /\u003e\r\n\tFor example:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_BINARIES\u003d(\r\n\t\"golang.org/x/tools/cmd/godoc\"\r\n\t\"golang.org/x/tools/cmd/guru:goguru\"\r\n\t\"golang.org/x/tools/cmd/stringer:/usr/local/bin/gostringer\"\r\n)\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill build and install \u003ccode\u003e\"godoc\"\u003c/code\u003e, \u003ccode\u003e\"goguru\"\u003c/code\u003e, and \u003ccode\u003e\"gostringer\"\u003c/code\u003e binaries.\r\n\t\u003cbr /\u003e\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_VERSION\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tVersion string to embed in the executable binary. The variable \u003ccode\u003emain.Version\u003c/code\u003e is set to this value at build time.\u003cbr /\u003e\r\n\tFor example:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_VERSION\u003d\"${PVR}\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill set \u003ccode\u003emain.Version\u003c/code\u003e string variable to package version and revision (if any) of the ebuild.\r\n\t\u003cbr /\u003e\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_PACKAGES\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tGo packages to install in \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e.\r\n\tPackages are installed in \u003cb\u003e\u003ccode\u003e\"/usr/lib/gopath\"\u003c/code\u003e\u003c/b\u003e such that they can be imported later from Go code using the exact paths listed here.\u003cbr /\u003e\r\n\tFor example:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eCROS_GO_PACKAGES\u003d(\r\n\t\"github.com/golang/glog\"\r\n)\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\twill install package files to \u003ccode\u003e\"/usr/lib/gopath/src/github.com/golang/glog\"\u003c/code\u003e and other Go projects can use the package with\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eimport \"github.com/golang/glog\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\tIf the last component of a package path is \u003ccode\u003e\"...\"\u003c/code\u003e, it is expanded to include all Go packages under the directory.\r\n\t\u003cbr /\u003e\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003eCROS_GO_TEST\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tGo packages to test.\r\n\tPackage tests are run with \u003ccode\u003e-short\u003c/code\u003e flag by default.\r\n\tPackage tests are always built and run locally on host.\r\n\tDefault is to test all packages in \u003ccode\u003eCROS_GO_WORKSPACE\u003c/code\u003e(s).\r\n\t\u003cbr /\u003e\u003cbr /\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003ecros-go_src_uri\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tConstruct a valid \u003ccode\u003eSRC_URI\u003c/code\u003e from \u003ccode\u003eCROS_GO_SOURCE\u003c/code\u003e. Set the \u003ccode\u003eSRC_URI\u003c/code\u003e in an ebuild with:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eSRC_URI\u003d\"$(cros-go_src_uri)\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003ecros-go_gopath\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tA valid \u003ccode\u003eGOPATH\u003c/code\u003e for \u003ccode\u003eCROS_GO_WORKSPACE\u003c/code\u003e. Set the \u003ccode\u003eGOPATH\u003c/code\u003e in an ebuild with:\r\n\t\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eGOPATH\u003d\"$(cros-go_gopath)\"\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003e\r\n\t\u003c/dd\u003e\r\n\r\n\t\u003cdt\u003e\u003ccode\u003ecros_go\u003c/code\u003e\u003c/dt\u003e\r\n\t\u003cdd\u003e\r\n\tWrapper function for invoking the Go tool from an ebuild. It provides the following functionality:\r\n\t\u003cul\u003e\r\n\t\t\u003cli\u003eThe correct cross-compiler is automatically detected and used. For example, when running \u003ccode\u003e\"emerge-daisy\"\u003c/code\u003e, \u003ccode\u003e\"armv7a-cros-linux-gnueabi-go\"\u003c/code\u003e will be used to build Go packages and binaries.\u003c/li\u003e\r\n\t\t\u003cli\u003eThe \u003ccode\u003eGOPATH\u003c/code\u003e variable is setup automatically. For example, when running \u003ccode\u003e\"emerge-daisy\"\u003c/code\u003e, Go packages will be looked up in the local workspace, as well as in \u003ccode\u003e\"/build/daisy/usr/lib/gopath\"\u003c/code\u003e.\u003c/li\u003e\r\n\t\t\u003cli\u003eWhen cross-compiling Go packages that use Cgo, the correct C/C++ cross-compilers for the target are automatically detected and used.\u003c/li\u003e\r\n\t\u003c/ul\u003e\r\n\tFor most ebuilds, setting the \u003ccode\u003eCROS_GO_BINARIES\u003c/code\u003e variable should be enough to build and install Go binaries. Implementation of \u003ccode\u003eCROS_GO_BINARIES\u003c/code\u003e uses the \u003ccode\u003ecros_go\u003c/code\u003e wrapper internally.\r\n\t\u003c/dd\u003e\r\n\u003c/dl\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2820759774765985493"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide/go-in-chromium-os"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4247162851563847597"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4247162851563847597"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4247162851563847597"}],"author":[{"name":{"$t":"Rahul Chaudhry"},"email":{"$t":"rahulchaudhry@chromium.org"}}],"sites$pageName":{"$t":"go-in-chromium-os"},"sites$revision":{"$t":"51"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2520814189423425890"},"published":{"$t":"2018-06-19T15:31:33.232Z"},"updated":{"$t":"2018-06-25T12:03:28.351Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-25T12:03:25.407Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Privilege escalation via unchecked TPM reset"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:3pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:20pt;white-space:pre-wrap\"\u003eVulnerability description\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis vulnerability is caused by a hardware design problem specific to a small faction of device models resulting in the main CPU being able to trigger a reset of the TPM while the main CPU doesn't reset. This falls short of the design requirement that a TPM reset implies a reset of the main CPU as well. By interacting in a certain way with the power management circuitry, the main CPU can trigger a reset signal that will affect the TPM, but not the main CPU. After a reset, the TPM starts out in a state where the main CPU can access a lot more things in the TPM. The usual boot flow locks down the TPM as we progress through the boot flow. However, since the reset took place while the OS is already booted, the TPM is left in the state that allows access to privileged data and commands which is intended to only be accessible to the firmware.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe vulnerability allows attackers with root privileges to trigger a TPM reset. Afterwards, the following TPM functionality is available to the attacker:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTPM physical presence - a special privileged mode to access the TPM that is intended for firmware use only. Allows access commands that are normally not accessible to the OS, or only accessible with TPM owner authorization.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePlatform Configuration Registers (PCR) reset to their initial state. These TPM hardware registers reflect the state of the system (e.g. boot mode: verified or developer) and can now be updated maliciously to claim an incorrect state that does not reflect the actual state.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Impact\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eImpact\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe following Chrome OS security features are affected by the bug:\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre;margin-left:11pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRollback protection for the firmware and kernel.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre;margin-left:11pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRemote attestation aka \"Verified Access\" statements regarding boot mode are no longer trustworthy.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre;margin-left:11pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDevice-wide disk encryption secrets can leak across normal mode / developer mode transitions.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre;margin-left:11pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDevices may be forced into developer mode without explicit user consent.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre;margin-left:11pt\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLockbox / installation-time attributes lose their intended write-once property. Decisions that are supposed to be irreversible after initial device setup can be tampered with (most prominently, enterprise vs. consumer device mode).\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNote that the bug only affects the TPM's operational state and it specifically does not lead to compromise of secrets held by the TPM. Specifically, encrypted user data or TPM-backed encryption keys are not at risk.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Affected-Versions\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected Versions\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS version 67 rolls out a firmware update (including a firmware version bump to prevent downgrade to vulnerable firmware versions) that includes the firmware mitigation described below.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNewly-produced devices incorporate a hardware change that further inhibits the ability for the TPM to get reset in isolation at the electrical level.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Affected-Devices\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected Devices\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe vast majority of Chrome OS devices deployed in the field are unaffected. Only the following device models are affected (code names and product names):\u003c/span\u003e\u003c/p\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eelm - \"Acer Chromebook R13 (CB5-312T)\"\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehana - \"Lenovo 300e/N23 Yoga/Flex 11 Chromebook\"\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehana - \"Poin2 Chromebook 11C\"\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehana - \"Poin2 Chromebook 14\"\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOnly elm and hana devices with Board IDs less than 5 is affected. The Board ID of a device can be determined by checking the bios_info section displayed on chrome://system.\u003c/span\u003e\u003c/p\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:20pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Mitigations\" /\u003e\u003cspan style\u003d\"font-size:20pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eMitigations\u003c/span\u003e\u003c/h1\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Firmware\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eFirmware\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVia updated firmware, Chrome OS now blocks access to the offending parts of the power management controller from the operating system. This prevents the OS from triggering a TPM reset and thus fixes the problem.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:18pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Hardware\" /\u003e\u003cspan style\u003d\"font-size:16pt;font-family:Arial;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eHardware\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAs a defense-in-depth hardening measure, the schematics of the affected devices have been changed to generate the TPM reset signal in a way that won't be affected by the problematic power management controller interactions. Newly-produced devices contain these changes.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/unchecked_tpm_reset"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2520814189423425890"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2520814189423425890"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2520814189423425890"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$pageName":{"$t":"unchecked_tpm_reset"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/736779060150749398"},"published":{"$t":"2016-08-24T23:22:21.342Z"},"updated":{"$t":"2018-06-22T18:54:29.971Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-22T18:54:29.970Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"DirectWrite Font Proxy"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cb\u003e\u003cfont size\u003d\"5\"\u003eOverview\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cp\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe sandbox prevents the renderer from using the system font collection. To get around this, we use IPC to enumerate fonts from the system collection in the browser and load the corresponding font files in the renderer. The renderer is still able to leverage the functionality provided by DirectWrite by loading just the needed font files into individual collections, and presenting an IDWriteFontCollection interface that allows loading fonts on demand.\u003c/font\u003e\u003c/p\u003e\u003cdiv\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont size\u003d\"5\"\u003eImplementation\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/directwrite-font-proxy/Removing%20DWrite%20font%20cache%20%281%29.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"font-family:verdana,sans-serif;font-size:small\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1529693669936/developers/design-documents/directwrite-font-proxy/Removing%20DWrite%20font%20cache%20%281%29.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDWriteFontProxyMessageFilter is responsible for interacting with the system font collection and processing the IPC messages. It can determine if any given font is present on the system, and return the list of corresponding font files. The message filter is also involved in font fallback.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe DWriteFontCollectionProxy implements IDWriteFontCollection, which is the primary interface the font proxy exposes to its clients (primarily Blink and Skia). The font collection proxy maintains a cache of all previously loaded font families, as well as a list of family names which it tried to load but which were not present on the system. When asked for a font family, the collection will send an IPC to determine if the family is present. If the family exists, the collection will return a DWriteFontFamilyProxy instance. Later, when the family is asked for more detailed font data, the proxy will send another IPC to get a list of needed font files from the browser. These font files are loaded into a custom IDWriteFontCollection using \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIDWriteFactory::CreateCustomFontCollection, which provides the needed IDWriteFontFamily.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe DWriteFontFamilyProxy implements IDWriteFontFamily. This is mostly a pass-through implementation. The font family proxy will ensure that the font family is loaded (this involves sending an IPC to get the list of font files), and subsequently will forward calls to the underlying DirectWrite font family.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:x-large;background-color:transparent\"\u003e\u003cb\u003eFont Fallback\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Font-fallback-uses-a-similar-mechanism-to-avoid-having-to-load-all-the-fonts-in-the-renderer.-When-MapCharacters-is-called-FontFallback-will-send-an-IPC-to-locate-the-fallback-font-using-the-system-font-collection.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eFont fallback uses a similar mechanism to avoid having to load all the fonts in the renderer. When MapCharacters is called, FontFallback will send an IPC to locate the fallback font using the system font collection.\u003c/span\u003e\u003c/h4\u003e\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eFuture development\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eWindows 10 implments \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eIDWriteFactory3::CreateFontCollectionFromFontSet which may provide a way to create a font collection that has all the same data as the system collection, but does not require loading all the font files. The following info was provided by a Microsoft developer and describes a potential approach:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003eIt sounds like you’ve found a pretty good solution with your IPC approach, but I’ll explain more about IDWriteFontSetBuilder in case you find it helpful. In Windows 10, the font collection API is actually implemented in terms of the new font set API. Once you’ve created a custom font set, you can call IDWriteFactory3::CreateFontCollectionFromFontSet to create an equivalent font collection from it. There’s no need to abandon your existing code that uses IDWriteFontCollection, which is still fully supported. However, you might also find it helpful to use the font set API directly in some cases – for example, to query by PostScript name.\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e \u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003eTo create a custom font set:\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e1.       Call IDWriteFactory3::CreateFontSetBuilder.\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e2.       Call IDWriteFontSetBuilder::AddFontFaceReference once for each font you want to add.\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e3.       Call IDWriteFontSetBuilder::CreateFontSet.\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e \u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003eThere are two overloads of AddFontFaceReference. The one you want takes an IDWriteFontFaceReference and an array of DWRITE_FONT_PROPERTY structures. When you add a font this way, CreateFontSet just constructs the font set using the properties you specify, so it doesn’t have to parse the font. The other overload just takes a font face reference, which means CreateFontSet has to parse the font file to extract the font properties.\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e \u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003eThe above assumes you have a priori knowledge of all the font properties. One possible design would be for your higher-privilege process to get the system font set from DWrite, iterate over all the fonts, and serialize the font references (file names) and corresponding properties to an XML for JSON file. The lower-privilege processes can then consume that file to construct a custom font set (and font collection) in-process.\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003e \u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cdiv\u003eTo create a font face reference, you could call IDWriteFactory3::CreateFontFaceReference – no need to implement a custom loader. We won’t actually open the font file unless you use the font. Note, however, that creating an IDWriteFont object counts as “using” the font in this context because not all the information exposed by that interface is stored as part of the font set. Therefore, you want to avoid patterns in which you enumerate all the fonts in the collection and create IDWriteFont objects for each. For example, you might be doing that now in order to build up a dictionary of PostScript names (something no longer necessary because PostScript name lookup is directly supported by IDWriteFontSet).\u003c/div\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/directwrite-font-proxy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/736779060150749398"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/736779060150749398"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/736779060150749398"}],"author":[{"name":{"$t":"Ilya Kulshin"},"email":{"$t":"kulshin@chromium.org"}}],"sites$pageName":{"$t":"directwrite-font-proxy"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7675931783791209987"},"published":{"$t":"2016-08-24T23:41:11.328Z"},"updated":{"$t":"2018-06-22T18:54:29.936Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-08-24T23:41:11.328Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Removing DWrite font cache (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7675931783791209987"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/736779060150749398"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/directwrite-font-proxy/Removing%20DWrite%20font%20cache%20(1).png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7675931783791209987"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7675931783791209987"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7675931783791209987"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7675931783791209987"}],"author":[{"name":{"$t":"Ilya Kulshin"},"email":{"$t":"kulshin@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6409270596409887175"},"published":{"$t":"2018-06-22T18:38:01.833Z"},"updated":{"$t":"2018-06-22T18:53:24.681Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-22T18:53:24.681Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Lazy FP Restore Vulnerability Status for Chrome OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Vulnerability-description\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eVulnerability description\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSystem software utilizing lazy floating point state restore in systems using Intel Core-based microprocessors may potentially allow a local process to infer data from another process through a speculative execution side channel. Exploitation of the vulnerability requires the ability to run native code on the device. \u003c/span\u003e\u003cspan style\u003d\"color:rgb(85,85,85);background-color:transparent\"\u003e\u003ca href\u003d\"https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00145.html\" rel\u003d\"nofollow\"\u003eCVE-2018-3665\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Chrome-OS-response\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS response\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eChrome OS 68, which will be released to the stable channel in late July 2018, will provide patches to the OS kernel to mitigate this vulnerability. Chrome OS devices will receive these updates automatically.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:16pt;margin-bottom:4pt\"\u003e\u003ca name\u003d\"TOC-Affected-devices\" /\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Arial;color:rgb(67,67,67);background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003eAffected devices\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eChrome OS Intel devices with Core-based processors may be affected. \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium;font-family:arial,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecpu\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium;font-family:arial,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e line in the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome:system\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:medium;font-family:arial,sans-serif;vertical-align:baseline;white-space:pre-wrap\"\u003e page will show what CPU the device has.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;font-size:medium;line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003e\u003cb\u003e\r\n\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Arial,Verdana,sans-serif;white-space:normal;font-size:medium;line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;white-space:pre-wrap\"\u003eThe following list covers affected devices that will be mitigated in Chrome OS 68:\u003c/span\u003e\u003c/p\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13.3333px;white-space:normal;margin-left:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13.3333px;white-space:normal;margin-left:0pt\"\u003e\u003ctable border\u003d\"1\" cellpadding\u003d\"0\" cellspacing\u003d\"0\" dir\u003d\"ltr\" style\u003d\"table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:none\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"324\" /\u003e\u003ccol width\u003d\"118\" /\u003e\u003ccol width\u003d\"154\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;font-weight:bold;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eMarketing name\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;font-weight:bold;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePublic codename\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;font-weight:bold;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ePlatform\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 13 3380\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003easuka\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebase 24\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ebuddy\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSamsung Chromebook Pro\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ecaroline\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebook Flip C302\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ecave\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 13 G1\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003echell\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-Y\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Pixelbook\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eeve\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eKabylake-Y\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebook 14\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003efalco\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eToshiba Chromebook 2 (2015 Edition)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003egandof\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebox CN62\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eguado\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eChromebook 14 for work (CP5-471)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elars\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eToshiba Chromebook\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eleon\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (C771, C771T)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elili\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Chromebook Pixel\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elink\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIvy Bridge\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 13 7310\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003elulu\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebox\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emccloud\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLG Chromebase 22CV241\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLG Chromebase 22CB25S\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003emonroe\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 11 (C740)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epaine\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eASUS Chromebox CN60\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epanther\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer C720 Chromebook\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003epeppy\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebox CXI2\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003erikku\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eGoogle Chromebook Pixel (2015)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esamus\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eThinkpad 13 Chromebook\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003esentry\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eSkylake-U\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo Thinkpad X131e Chromebook\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003estout\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eIvy Bridge\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eLenovo ThinkCentre Chromebox\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003etidus\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebox\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003etricky\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eDell Chromebook 11\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ewolf\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eAcer Chromebook 15 (CB5-571)\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eyuna\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eBroadwell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:21px\"\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:316px;height:44px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHP Chromebox CB1-(000-099)\u003cbr /\u003eHP Chromebox G1\u003cbr /\u003eHP Chromebox for Meetings\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:110px;height:44px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003ezako\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:bottom;overflow:hidden;padding:2px 3px;width:146px;height:44px\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eHaswell\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/lazy-fp-restore-vulnerability-status"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6409270596409887175"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6409270596409887175"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6409270596409887175"}],"author":[{"name":{"$t":"Greg Kerr"},"email":{"$t":"kerrnel@chromium.org"}}],"sites$pageName":{"$t":"lazy-fp-restore-vulnerability-status"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8242200317907837356"},"published":{"$t":"2015-05-06T18:58:43.073Z"},"updated":{"$t":"2018-06-22T18:41:25.386Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-22T18:41:23.419Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GRIT Design Overview"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThis document is intended as a rough overview of the design of GRIT.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eBefore reading this, you should probably read the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/tools-we-use-in-chromium/grit/grit-users-guide\"\u003eGRIT user's guide\u003c/a\u003e for background.\u003c/p\u003e\u003ch1 style\u003d\"font-size:x-large;margin-top:0px;border:0px;padding-left:0px;max-width:700px;font-family:arial,sans-serif;background:none\"\u003e\u003ca name\u003d\"Design_Overview\" /\u003eDesign Overview\u003c/h1\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe source of truth in GRIT is the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file (an XML formatted file). This file format is only an input format for GRIT; it is not a resource format in and of itself. For some good examples of what \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e files look like, see the \u003ca href\u003d\"https://cs.chromium.org/search/?q\u003dfile:%5C.grd\u0026amp;sq\u003dpackage:chromium\u0026amp;type\u003dcs\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003evarious such files\u003c/a\u003e in the Chromium project.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe structure and semantics of the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file are encoded in the various sub-classes of \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit.node.Base\u003c/tt\u003e.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eFrom the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file and various files it may reference, GRIT builds up an in-memory representation of all of the \"source\" resources, most often the resources as they are designed in English, although a different source language than English may be specified.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThrough the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;outputs\u0026gt;\u003c/tt\u003e section, the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file also specifies which languages to output, and in which formats.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGRIT uses the idea that identical messages (translation units) should receive identical translations, to avoid translators having to translate the same message multiple times. To enable multiple identical messages to have different meanings (e.g. \"open\" as a noun vs. \"open\" as a verb) GRIT adds the ability to specify a \u003ci\u003emeaning\u003c/i\u003e attribute that allows the messages to be translated differently.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file may contain various types of resources:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eNon-translatable resources such as images, that should get output by GRIT to whatever resource format is being used. This is what the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;include\u0026gt;\u003c/tt\u003e node is for.\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eSingle mesages (translation units) using the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;message\u0026gt;\u003c/tt\u003e node. Non-translatable parts of messages may be demarcated with \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;ph\u0026gt;\u003c/tt\u003e nodes (short for \"placeholder\").\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003eStructured resource formats, that GRIT can break down into multiple messages. Examples are HTML files and things such as dialog box or menu definitions from Windows \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files. The \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e node is used to reference these formats, and always points to a file external to the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file.\u003c/li\u003e\u003c/ul\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eA \u003ci\u003eformatter\u003c/i\u003e is something that knows how to take a \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file and turn it into the resource format (e.g. Windows \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.rc\u003c/tt\u003e files, Chromium \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.pak\u003c/tt\u003e files, Android resource files, etc.) in each of the different languages specified in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;outputs\u0026gt;\u003c/tt\u003e section.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe various formatters available are in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit.format\u003c/tt\u003e package.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eA \u003ci\u003egatherer\u003c/i\u003e is something that knows how to break a structured resource (\u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;structure\u0026gt;\u003c/tt\u003e node) into messages, and how to create a translated version of the structured resource file.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eThe various gatherers available are in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit.gather\u003c/tt\u003e package.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eA \u003ci\u003etool\u003c/i\u003e is something you invoke from the command line. Tools live in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit.tool\u003c/tt\u003e package and are invoked as \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit xyz\u003c/tt\u003e where \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003exyz\u003c/tt\u003e is the name of the tool, and the binding from name to package is specified in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit.grit_runner\u003c/tt\u003e module.\u003c/p\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em;font-family:arial,sans-serif;font-size:13.1199998855591px\"\u003eGRIT is meant as a tool that, given a set of input files in the source language, and a set of translations, can produce resource files in all target languages (by default, using pseudo-translations for messages that do not have available translations). It has basic features for packaging messages for delivery to translators, and for receiving translations back from translators. Its formats for this are the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xmb\u003c/tt\u003e format (generated by the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003egrit xmb\u003c/tt\u003e tool) and the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xtb\u003c/tt\u003e format (referenced by the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e\u0026lt;translation\u0026gt;\u003c/tt\u003e node in the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.grd\u003c/tt\u003e file). These are very basic formats that contain the messages, with placeholders and with any descriptions provided to give the translators context. The assumption is that there is some other system that reads the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xmb\u003c/tt\u003e format, provides translators with another format or a UI that lets them translate more easily, then takes what it receives back from translators and packages it back up into the \u003ctt style\u003d\"font-family:Monaco,DejaVu Sans Mono,Bitstream Vera Sans Mono,Lucida Console,monospace;font-size:12.2016000747681px;max-width:66em\"\u003e.xtb\u003c/tt\u003e format.\u003c/p\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5837297656848244278"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/tools-we-use-in-chromium/grit/grit-design-overview"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8242200317907837356"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8242200317907837356"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8242200317907837356"}],"author":[{"name":{"$t":"Jói Sigurðsson"},"email":{"$t":"joi@chromium.org"}}],"sites$pageName":{"$t":"grit-design-overview"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5834934307358658469"},"published":{"$t":"2018-06-21T15:36:27.060Z"},"updated":{"$t":"2018-06-21T15:36:27.091Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-21T15:36:27.060Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"twinkie_v1.11.21-3e33e08af.webusb.bin"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5834934307358658469"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9043492987541181918"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/twinkie/twinkie_v1.11.21-3e33e08af.webusb.bin"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5834934307358658469"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5834934307358658469"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5834934307358658469"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5834934307358658469"}],"author":[{"name":{"$t":"Vincent Palatin"},"email":{"$t":"vpalatin@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3861511031587518254"},"published":{"$t":"2018-06-21T15:35:57.112Z"},"updated":{"$t":"2018-06-21T15:35:57.145Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-21T15:35:57.112Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"twinkie_v1.11.20-005227d8f.bin"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3861511031587518254"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9043492987541181918"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/twinkie/twinkie_v1.11.20-005227d8f.bin"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3861511031587518254"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3861511031587518254"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3861511031587518254"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3861511031587518254"}],"author":[{"name":{"$t":"Vincent Palatin"},"email":{"$t":"vpalatin@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1280500072215839045"},"published":{"$t":"2008-08-28T19:25:31.315Z"},"updated":{"$t":"2018-06-21T12:24:11.692Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2016-10-10T20:20:07.347Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multi-process Architecture"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\u003cp\u003e\r\nThis document describes Chromium's high-level architecture.\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Problem\" /\u003eProblem\u003c/h2\u003e\r\n\u003cp\u003e\r\nIt's nearly impossible to build a rendering engine that never crashes\r\nor hangs. It's also nearly impossible to build a rendering engine that\r\nis perfectly secure.\r\n\u003c/p\u003e\r\n\u003cp\u003eIn some ways, the state of web browsers around 2006 was like that of the single-user, co-operatively multi-tasked operating systems of the past. As a misbehaving application in such an operating system could take down the entire system, so could a misbehaving web page in a web browser. All it took is one browser or plug-in bug to bring down the entire browser and all of the currently running tabs.\u003c/p\u003e\r\n\u003cp\u003eModern operating systems are more\r\nrobust because they put applications into separate processes that are\r\nwalled off from one another. A crash in one application generally does\r\nnot impair other applications or the integrity of the operating system, and each user's access to other users' data is restricted.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Architectural_overview\"\u003eArchitectural overview\u003c/a\u003e\u003c/h2\u003e\r\n\u003cp\u003eWe use separate processes for browser tabs to protect the\r\noverall application from bugs and glitches in the rendering engine. We also restrict access from each rendering engine process to others and to the rest of the system. In some ways, this brings to web browsing the benefits that memory protection and access control brought to operating systems.\u003c/p\u003e\r\n\u003cp\u003eWe refer to the main process that runs the UI and manages tab and plugin processes as the \"browser process\" or \"browser.\" Likewise, the tab-specific processes are called \"render processes\" or \"renderers.\" The renderers use the \u003ca href\u003d\"https://www.chromium.org/blink\"\u003eBlink\u003c/a\u003e open-source layout engine for interpreting and laying out HTML.\u003c/p\u003e\r\n\u003cdiv style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture/arch.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\"\u003e\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197832277/developers/design-documents/multi-process-architecture/arch.png\" style\u003d\"border-width:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Managing_Renderer_Processes\"\u003e Managing render processes \u003c/a\u003e\u003c/h3\u003e\r\n\u003cp\u003eEach render process has a global \u003ccode\u003eRenderProcess\u003c/code\u003e object that manages communication with the parent browser process and maintains global state. The browser maintains a corresponding \u003ccode\u003eRenderProcessHost\u003c/code\u003e\r\nfor each render process, which manages browser state and\r\ncommunication for the renderer. The browser and the renderers\r\ncommunicate using \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/inter-process-communication\"\u003eChromium's IPC system\u003c/a\u003e.\r\n\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Managing_Views\"\u003e Managing views \u003c/a\u003e\u003c/h3\u003e\r\n\u003cp\u003e\r\nEach render process has one or more \u003ccode\u003eRenderView\u003c/code\u003e objects, managed by the \u003ccode\u003eRenderProcess\u003c/code\u003e, which correspond to tabs of content. The corresponding \u003ccode\u003eRenderProcessHost\u003c/code\u003e maintains a \u003ccode\u003eRenderViewHost\u003c/code\u003e\r\ncorresponding to each view in the renderer. Each view is given a view\r\nID that is used to differentiate multiple views in the same renderer.\r\nThese IDs are unique inside one renderer but not within the browser, so\r\nidentifying a view requires a \u003ccode\u003eRenderProcessHost\u003c/code\u003e and a view ID. Communication from the browser to a specific tab of content is done through these \u003ccode\u003eRenderViewHost\u003c/code\u003e objects, which know how to send messages through their \u003ccode\u003eRenderProcessHost\u003c/code\u003e to the \u003ccode\u003eRenderProcess\u003c/code\u003e and on to the \u003ccode\u003eRenderView\u003c/code\u003e.\r\n\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Components_and_Interfaces\"\u003e Components and interfaces \u003c/a\u003e\u003c/h2\u003e\r\n\u003cp\u003eIn the render process:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eThe \u003ccode\u003eRenderProcess\u003c/code\u003e handles IPC with the corresponding \u003ccode\u003eRenderProcessHost\u003c/code\u003e in the browser. There is exactly one \u003ccode\u003eRenderProcess\u003c/code\u003e object per render process. This is how all browser ↔ renderer communication happens.\u003c/li\u003e\r\n\u003cli\u003eThe \u003ccode\u003eRenderView\u003c/code\u003e object communicates with its corresponding \u003ccode\u003eRenderViewHost\u003c/code\u003e in the browser process (via the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcess\u003c/span\u003e), and our WebKit embedding layer. This object represents the contents of one web page in a tab or popup window\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin:10px 0px;padding:0px\"\u003eIn the browser process:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-right:10px\"\u003e\r\n\u003cli style\u003d\"padding:1px 0px\"\u003eThe \u003ccode\u003eBrowser\u003c/code\u003e object represents a top-level browser window.\u003c/li\u003e\r\n\u003cli style\u003d\"padding:1px 0px\"\u003eThe \u003ccode\u003eRenderProcessHost\u003c/code\u003e object represents the browser side of a single browser ↔ renderer IPC connection. There is one \u003ccode\u003eRenderProcessHost\u003c/code\u003e in the browser process for each render process.\u003c/li\u003e\r\n\u003cli style\u003d\"padding:1px 0px\"\u003eThe \u003ccode\u003eRenderViewHost\u003c/code\u003e object encapsulates communication with the remote \u003ccode\u003eRenderView\u003c/code\u003e, and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost\u003c/span\u003e handles the input and painting for \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget\u003c/span\u003e in the browser.\u003c/li\u003e\r\n\u003c/ul\u003e\r\nFor more detailed information on how this embedding works, see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome\"\u003eHow Chromium displays web pages\u003c/a\u003e design document.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Sharing-the-render-process\" /\u003eSharing the render process \u003c/h2\u003e\r\n\u003cp\u003eIn general, each new window or tab opens in a new process. The browser\r\nwill spawn a new process and instruct it to create a single \u003ccode\u003eRenderView\u003c/code\u003e.\r\n\u003c/p\u003e\r\n\u003cp\u003e\r\nSometimes it is necessary or desirable to share the render process between\r\ntabs or windows. A web application opens a new window\r\nthat it expects to communicate with synchronously, for example, using \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ewindow.open\u003c/span\u003e in JavaScript. In this case, when we create a new window or tab, we need\r\nto reuse the process that the window was opened with. We also have strategies to assign new tabs to existing processes if the total number of processes is too large, or if the user already has a process open navigated to that domain. These strategies are described in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/process-models\" style\u003d\"outline-style:none;color:rgb(85,26,139)\"\u003eProcess Models\u003c/a\u003e.\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Detecting_crashed_or_misbehaving\"\u003e Detecting crashed or misbehaving renderers \u003c/a\u003e\u003c/h2\u003e\r\n\u003cp\u003e\r\nEach IPC connection to a browser process watches the process handles.\r\nIf these handles are signaled, the render process has crashed and the\r\ntabs are notified of the crash. For now, we show a \"sad tab\" screen that notifies the user that the renderer has crashed. The page can be reloaded by pressing the reload button or by starting a new navigation. When this happens, we notice that there is no process and create a new one.\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Sand_boxing_the_renderer\"\u003e Sandboxing the renderer \u003c/a\u003e\u003c/h2\u003e\r\n\u003cp\u003e\r\nGiven the renderer is running in a separate process, we have the opportunity to restrict its\r\naccess to system resources via \u003ca href\u003d\"https://www.chromium.org/developers/design-documents/sandbox\"\u003esandboxing\u003c/a\u003e. For example, we can ensure that the renderer's only \r\naccess to the network is via its parent browser process. Likewise, we can restrict\r\nits access to the filesystem using the host operating system's built-in permissions.\u003c/p\u003e\r\n\u003cp\u003eIn addition to restricting the renderer's access to the filesystem and network, we can\r\nalso place limitations on its access to the user's display and related objects. We run each render process on a separate Windows \"\u003ca href\u003d\"https://msdn.microsoft.com/en-us/library/windows/desktop/ms682573(v\u003dvs.85).aspx\" rel\u003d\"nofollow\"\u003eDesktop\u003c/a\u003e\" which is not visible to the user. This prevents a compromised renderer from opening new windows or capturing keystrokes.\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Giving-back-memory\" /\u003eGiving back memory\u003c/h2\u003e\r\n\u003cp\u003e\r\nGiven renderers running in separate processes, it becomes straightforward to treat hidden tabs as lower priority. Normally, minimized processes on Windows have their memory automatically put into a pool of \"available memory.\" In low-memory situations, Windows will swap this memory to disk before it swaps out higher-priority memory, helping to keep the user-visible programs more responsive. We can apply this same principle to hidden tabs. When a render process has no top-level tabs, we can release that process's \"working set\" size as a hint to the system to swap that memory out to disk first if necessary. Because we found that reducing the working set size also reduces tab switching performance when the user is switching between two tabs, we release this memory gradually. This means that if the user switches back to a recently used tab, that tab's memory is more likely to be paged in than less recently used tabs. Users with enough memory to run all their programs will not notice this process at all: Windows will only actually reclaim such data if it needs it, so there is no performance hit when there is ample memory.\u003c/p\u003e\r\n\u003cp\u003eThis helps us get a more optimal memory footprint in low-memory situations. The memory associated with seldom-used background tabs can get entirely swapped out while foreground tabs' data can be entirely loaded into memory. In contrast, a single-process browser will have all tabs' data randomly distributed in its memory, and it is impossible to separate the used and unused data so cleanly, wasting both memory and performance.\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"Plug_ins\"\u003ePlug-ins and Extensions\u003c/a\u003e\u003c/h2\u003e\r\nFirefox-style NPAPI plug-ins ran in their own process, separate from renderers. This is described in detail in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/plugin-architecture\"\u003ePlugin Architecture\u003c/a\u003e. \u003cul\u003e\r\n\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003ca href\u003d\"https://www.chromium.org/developers/design-documents/site-isolation\"\u003eSite Isolation\u003c/a\u003e project aims to provide more isolation between renderers, an early deliverable for this project includes running Chrome's HTML/JavaScript content extensions in isolated processes.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1280500072215839045"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280500072215839045"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280500072215839045"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"multi-process-architecture"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5615898938916898385"},"published":{"$t":"2017-05-08T17:26:55.376Z"},"updated":{"$t":"2018-06-13T19:55:57.943Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-13T19:55:55.917Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Information for Third-party Applications on Mac"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eJavaScript injection via AppleScript will soon be disabled by default in Chrome stable. We’re making this change in order to protect users from injection of unwanted content. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e \u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eUsers who need this functionality can re-enable it by going to the menu bar, View \u0026gt; Developer \u0026gt; Allow JavaScript from Apple Events\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e \u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eAlternatively, applications that legitimately need to inject JavaScript into Chrome can do so by publishing an\u003c/span\u003e\u003ca href\u003d\"https://developer.chrome.com/extensions\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#471264;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eextension\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e and using Native Messaging to communicate with their application process. For more information, see\u003c/span\u003e\u003ca href\u003d\"https://developer.chrome.com/extensions/nativeMessaging\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003ehttps://developer.chrome.com/extensions/nativeMessaging\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.656;margin-top:0pt;margin-bottom:0pt;background-color:#ffffff\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap\"\u003eFor automation, developers can also use Telemetry: \u003ca href\u003d\"https://github.com/catapult-project/catapult/blob/master/telemetry/README.md\" rel\u003d\"nofollow\"\u003ehttps://github.com/catapult-project/catapult/blob/master/telemetry/README.md\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/applescript"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5615898938916898385"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5615898938916898385"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5615898938916898385"}],"author":[{"name":{"$t":"Meggin Kearney"},"email":{"$t":"mkearney@chromium.org"}}],"sites$pageName":{"$t":"applescript"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1255861932095370200"},"published":{"$t":"2010-04-02T20:05:17.937Z"},"updated":{"$t":"2018-06-12T17:32:38.491Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-12T17:32:36.304Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Diagnostic Mode"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eChromium (and Google Chrome) comes with a set of built-in diagnostic tests that any user can run. These tests can help determine the root cause of the following problems.\u003cdiv\u003e\u003cul\u003e\u003cli\u003eChrome fails to start\u003c/li\u003e\u003cli\u003eChrome crashes quickly after started\u003c/li\u003e\u003cli\u003eChrome starts but any tab created crashes or fails to load\u003c/li\u003e\u003cli\u003eChrome is extremely slow\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eWork in Progress\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e : Diagnostic mode is currently only available in the tip-of-tree version of Chromium for Windows and in the developer channel version of Google Chrome for Windows.  Furthermore, only a small set of diagnostic tests currently run (more are planned in the future).\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eDiagnostic mode is an environment that runs a set of tests before the browser starts. These tests vary in sophistication, from trivial checks that critical files exist, to more complex (and time consuming) tests that test the integrity of the key databases. Each test can pass, fail or simply be skipped if the test is not applicable. The output should be used as  as a starting point for further, more specific, investigation and troubleshooting.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Privacy\" /\u003ePrivacy\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eDiagnostic mode does not automatically send any information to Google.  It is up to the user to copy the text output from running diagnostic mode that they consider appropriate and helpful for others to see.  Furthermore, care has been taken to expose little to no personal information in the diagnostic output so that users can feel comfortable sharing it with internet help groups.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-to-run-windows-only-\" /\u003eHow to run (windows only)\u003c/h3\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eMake sure no instances of chrome.exe are running. Check in the Windows Task Manager for any zombie chrome.exe processes and end them if necessary.\u003c/li\u003e\u003cli\u003eOpen a command line session (cmd.exe)\u003c/li\u003e\u003cli\u003eChange directory (cd) to the directory of chrome.exe, for example,in Vista, regular chrome install is in \u003cfont face\u003d\"'courier new', monospace\"\u003eC:\\Users\\\u0026lt;user name\u0026gt;\\AppData\\Local\\Google\\Chrome\\Application\u003c/font\u003e\u003c/li\u003e\u003cli\u003eType chrome.exe --diagnostics  [enter]\u003c/li\u003e\u003c/ol\u003eA second console window will open and the tests will run automatically, and you should see something like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/diagnostic-mode/diagmode_wiki.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1384746999241/administrators/diagnostic-mode/diagmode_wiki.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis shows a run where all tests passed. If a test fails it will be marked with a \u003cspan style\u003d\"background-color:rgb(0,0,0)\"\u003e \u003c/span\u003e\u003cb\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cspan style\u003d\"background-color:rgb(0,0,0)\"\u003e[FAIL]\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cspan style\u003d\"background-color:rgb(0,0,0)\"\u003e \u003c/span\u003e entry.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/diagnostic-mode"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1255861932095370200"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1255861932095370200"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1255861932095370200"}],"author":[{"name":{"$t":"Carlos Pizano"},"email":{"$t":"cpu@chromium.org"}}],"sites$pageName":{"$t":"diagnostic-mode"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/451689948354109401"},"published":{"$t":"2017-04-06T23:29:58.721Z"},"updated":{"$t":"2018-06-11T16:45:25.484Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-11T16:45:23.197Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Memory"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cfont size\u003d\"3\"\u003eSee the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/memory/\"\u003emarkdown docs\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/memory"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/451689948354109401"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/451689948354109401"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/451689948354109401"}],"author":[{"name":{"$t":"Albert Wong"},"email":{"$t":"ajwong@chromium.org"}}],"sites$pageName":{"$t":"memory"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3588526122013333257"},"published":{"$t":"2015-05-22T13:36:08.939Z"},"updated":{"$t":"2018-06-06T21:56:24.414Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-06-06T21:56:21.288Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Running Telemetry on Chrome OS"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page has moved to:\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/docs/+/master/cros_vm.md#Run-telemetry-unit-tests\"\u003ehttps://chromium.googlesource.com/chromiumos/docs/+/master/cros_vm.md#Run-telemetry-unit-tests\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4695032730150632508"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/telemetry/running-telemetry-on-chrome-os"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3588526122013333257"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3588526122013333257"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3588526122013333257"}],"author":[{"name":{"$t":"Annie Sullivan"},"email":{"$t":"sullivan@chromium.org"}}],"sites$pageName":{"$t":"running-telemetry-on-chrome-os"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3559892786597557256"},"published":{"$t":"2010-02-08T16:40:07.916Z"},"updated":{"$t":"2018-05-31T16:37:13.180Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2014-06-13T23:35:31.266Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Menus, Hotkeys, \u0026 Command Dispatch (Mac)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis document covers how toolbar buttons, the main menu bar, and some context menus are hooked up to the back-end Command infrastructure in Chromium on Mac OS X.\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003eMenus are used in three places: the main menu, the toolbar menu, and the context menu for right clicks. Menus are constructed using the AppKit framework. The two relevant classes are NSMenu, and NSMenuItem. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eMac OS X has a main menu bar that needs to update based on the front-most window as well as remain functional when there are no windows open (a situation which can't happen on Windows and Linux). \u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Construction\" /\u003eConstruction\u003c/h2\u003e\u003cdiv\u003eThe class MenuController and its subclasses are used to dynamically generate or modify menus.\u003c/div\u003e\u003cdiv\u003eThe nib file 'MainMenu.xib' generates the static portion of the main menu.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ee.g.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eThe Bookmarks submenu of the main menu consists of:\u003c/div\u003e\u003cdiv\u003e1. The static portion of the submenu generated by MainMenu.xib\u003c/div\u003e\u003cdiv\u003e2. A dynamically updated portion generated by BookmarkMenuBridge.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Enabling-Disabling-Menu-Items\" /\u003eEnabling/Disabling Menu Items\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eThe cross-platform (XP) infrastructure uses a \u003cfont face\u003d\"'courier new', monospace\"\u003eCommandUpdater\u003c/font\u003e object to represent the enabled state of a set of commands. Each \u003cfont face\u003d\"'courier new', monospace\"\u003eBrowser\u003c/font\u003e object has a \u003cfont face\u003d\"'courier new', monospace\"\u003eCommandUpdater\u003c/font\u003e allowing it to maintain unique state that differs from window to window. User interface views, such as menus or buttons, are responsible for querying the appropriate \u003cfont face\u003d\"'courier new', monospace\"\u003eCommandUpdater\u003c/font\u003e \"model\" to obtain their enabled state.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn cocoa, the \"enabled\" state is determined by \u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003esending the \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003evalidateUserInterfaceItem:\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eselector up the responder chain for each menu item. Despite the fact that \u003cfont face\u003d\"courier new, monospace\"\u003eMenuController\u003c/font\u003e implements  \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent;font-size:10pt\"\u003evalidateUserInterfaceItem:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, it may not be a part of the responder chain. The relevant \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent;font-size:10pt\"\u003evalidateUserInterfaceItem:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e implementation will vary from menu to menu. \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eMost menu items are handled by the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-family:courier new,monospace\"\u003eBrowserWindowController\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e which asks its corresponding \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-family:courier new,monospace\"\u003eBrowser\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e's \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-family:courier new,monospace\"\u003eCommandUpdater\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e for the enabled state of the command id given by the item's \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt;font-family:courier new,monospace\"\u003etag\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. This also handles toggling commands and updating the item's title to match current application state.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eIn the case of buttons, the relevant controller (such as \u003c/span\u003eToolbarController\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e) registers for changes from the \u003c/span\u003eCommandUpdater\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e using a \u003c/span\u003eCommandObserverBridge\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e. When one of the relevant commands changes its state, the bridge sends \u003c/span\u003eenabledStateChangedForCommand:enabled:\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e allowing the controller to update the enabled state of the button.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eFor more information, see the \u003ca href\u003d\"http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/UIValidation/UIValidation.html#//apple_ref/doc/uid/10000040\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eApple documentation on User Interface Validation\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Menu-Item-Dispatch\" /\u003eMenu Item Dispatch\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eNSMenuItem has 3 important characteristics: the tag (XP id of the command), the hotkey/accelerator, and the action/target pair. There are two ways to invoke a menu item - by clicking on it, or by using the hotkey. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cdiv style\u003d\"font-size:10pt\"\u003e\u003cdiv\u003e\u003cb\u003eWhen a user selects a menu item by clicking on it:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eBrowserCrApplication\u003c/font\u003e receives a \u003cfont face\u003d\"courier new, monospace\"\u003esendAction:to:from: \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ecallback.\u003c/font\u003e It performs logging \u0026amp; exception handling. It forwards to its parent class.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eNSApplication\u003c/font\u003e invokes the action/target pair.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eIf the \u003cfont face\u003d\"courier new, monospace\"\u003eNSMenuItem\u003c/font\u003e was created by a \u003cfont face\u003d\"courier new, monospace\"\u003eMenuController\u003c/font\u003e subclass, it may have a custom action/target pair. The target is sent the action, and processes the response. END\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eBy default, the \u003cfont face\u003d\"courier new, monospace\"\u003eNSMenuItem\u003c/font\u003e has action\u003d\u003cfont face\u003d\"courier new, monospace\"\u003ecommandDispatch:\u003c/font\u003e target\u003d\u003cfont face\u003d\"courier new, monospace\"\u003efirstResponder\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e. The tag contains the id of the command. \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003eThere are 2 possible first responders.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eIf there exists a relevant browser window, the first responder is \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eBrowserWindowController\u003c/font\u003e, which forwards the invocation to \u003cfont face\u003d\"courier new, monospace\"\u003eBrowserCommandController::ExecuteCommandWithDisposition. \u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOtherwise, \u003c/font\u003ethe first responder is \u003cfont face\u003d\"courier new, monospace\"\u003eAppController\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, which processes the event in \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecommandDispatch:.\u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003eWhen a user presses the hotkey associated with a menu item (and there exists a relevant browser window)\u003c/b\u003e, \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:10pt;background-color:transparent\"\u003eChromeEventProcessingWindow \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eperformKeyEquivalent: \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eis invoked. It tries to process the hotkey as a extension action, or as a global keyboard shortcut (such as \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ectr+tab to move to next tab, see \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eglobal_keyboard_shortcuts_mac.mm\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e for more details). If it fails to process the hotkey, then an event is generated and goes through the same flow from directly clicking the menu item.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:small\"\u003eWhen a user presses the hotkey associated with a menu item (and there does not exist a browser window)\u003c/b\u003e\u003cspan style\u003d\"font-size:small\"\u003e, an event is generated \u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;background-color:transparent;font-size:10pt\"\u003eand goes through the same flow from directly clicking the menu item.\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThere is also a\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003ecommandDispatchUsingKeyModifiers:\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003efor dispatching commands that do different things based on the state of modifier keys (for example, command-clicking the \"Home\" button opens the home page in a new window).\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-General-Hotkey-Dispatch\" /\u003eGeneral Hotkey Dispatch\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eSee figure 1.5 in the \u003ca href\u003d\"https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW1\" rel\u003d\"nofollow\"\u003eCocoa Event Handling Guide\u003c/a\u003e. In Cocoa, an event can only be consumed a single time. The consumer priority is:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eMost OS shortcuts. e.g. (command+space) to invoke spotlight, or (command+alt+Esc) to invoke \"force kill\" dialog. Handled directly by Cocoa. No NSEvents are sent to Chrome.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eApplication specific shortcuts, handled through \u003cfont face\u003d\"courier new, monospace\"\u003e-[NSResponder performKeyEquivalent:]\u003c/font\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eApplication specific shortcuts from the menu. Handled directly by Cocoa.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eRemaining OS shortcuts (e.g. command+`) to shift through windows. Handled directly by Cocoa. No callbacks are sent to Chrome.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eView specific actions, handled through \u003cfont face\u003d\"courier new, monospace\"\u003e-[NSWindow sendEvent:]\u003c/font\u003e, which becomes \u003cfont face\u003d\"courier new, monospace\"\u003e-[NSView wheelScroll:]\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(or equivalent)\u003c/font\u003e at the view layer.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eChrome wants to give websites a chance to process hotkeys first, so the process becomes confusing. When Chrome handles \u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e-[NSResponder performKeyEquivalent:]\u003c/font\u003e, it marks the hotkey as consumed. The \u003cfont face\u003d\"courier new, monospace\"\u003eNSEvent\u003c/font\u003e never reaches steps 3 through 5. Chrome sends the event asynchronously to the renderer, which returns an asynchronous message indicating whether the event was consumed. If the event was not consumed, a new event is generated and passed through the entire cycle again, via \u003cfont face\u003d\"courier new, monospace\"\u003e-[NSApp sendEvent:]\u003c/font\u003e. The second time through, a flag is set so that \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e-[NSResponder performKeyEquivalent:]\u003c/font\u003e does not consume the event.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eOne important fact is that if Chrome chooses to not consume the event in step (2), NSMenu shortcuts are guaranteed to attempt to consume the event (step 3). Furthermore, the remaining OS shortcuts in step (4) can be modified by the user. Therefore, there is no well established method for determining whether the system would attempt to consume an event without also letting Chrome's NSMenu shortcuts attempt to consume the event. \u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/command-dispatch-mac"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3559892786597557256"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3559892786597557256"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3559892786597557256"}],"author":[{"name":{"$t":"Mike Pinkerton"},"email":{"$t":"pinkerton@chromium.org"}}],"sites$pageName":{"$t":"command-dispatch-mac"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1517618730316225879"},"published":{"$t":"2013-11-21T20:28:21.581Z"},"updated":{"$t":"2018-05-29T18:37:44.074Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-29T18:37:42.166Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Blocking Cross-Site Documents for Site Isolation"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-NOTE:-This-page-represents-earlier-work-that-led-to-the-current-Cross-Origin-Read-Blocking-CORB-policy.-Also-see-the-CORB-explainer-and-the-relevant-part-of-the-Fetch-spec.\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eNOTE: \u003cspan style\u003d\"font-weight:normal\"\u003eThis page represents earlier work that led to the current \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/corb-for-developers\"\u003eCross-Origin Read Blocking (CORB)\u003c/a\u003e policy.  Also see the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md\"\u003eCORB explainer\u003c/a\u003e and the relevant part of the \u003ca href\u003d\"https://fetch.spec.whatwg.org/#corb\" rel\u003d\"nofollow\"\u003eFetch spec\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Motivation\" /\u003eMotivation\u003c/h3\u003e\u003cdiv\u003eIn general, Chrome's renderer processes should not be given access to data they don't need.  Our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation\"\u003eSite Isolation project\u003c/a\u003e is trying to make it possible to limit a renderer process to pages from only a single site.  As part of this, Chrome needs to block such a process from receiving network responses that the site isn't allowed to use.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA web site is allowed to request \u003cb\u003edocuments\u003c/b\u003e from its own site (or those that have been made available using CORS), as well as \u003cb\u003eresources\u003c/b\u003e from any site.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDocuments\u003c/b\u003e include HTML, XML, and JSON files.  \u003cb\u003eResources\u003c/b\u003e include a wide variety of files that are \"opaque\" to the site (i.e., cannot be leaked back to the site's owner), including images, JavaScript, CSS, fonts, and TextTrack files, among others.  \u003cb\u003eCross-site documents\u003c/b\u003e come from a different site than the page that requests them and do not have CORS headers that would make them accessible.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHowever, we can't always rely solely on the MIME type of the HTTP response to distinguish documents from resources, since the MIME type on network responses is frequently wrong.  Content sniffing can help to confirm whether a document is what it claims to be, but using typical content sniffers would lead to overzealous blocking and create compatibility problems.  Fortunately, our experiments show that we can enforce a policy that blocks most cross-site documents without breaking existing sites, using a combination of MIME type and custom content sniffers.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Proposed-Policy\" /\u003eProposed Policy\u003c/h3\u003e\u003cdiv\u003eOur proposed \u003cb\u003ecross-site document blocking policy\u003c/b\u003e prevents a renderer process from receiving cross-site documents that (1) have a HTML, XML, or JSON MIME type, and (2) are confirmed to be that type by a custom content sniffer (or are marked NoSniff).  It does not currently protect files that have other MIME types.  Documents that are blocked appear as empty to the process that requested them.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhile implementing versions of this policy, we made several observations about how the content sniffing logic must behave:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor HTML, we cannot assume \"\u0026lt;!--\" is valid HTML prefix, since that also matches many JavaScript files in practice.  Instead, we plan to find the end of the HTML comment and then sniff again.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eFor HTML and XML, we cannot block \"\u0026lt;?xml\" unless we can confirm it isn't an SVG.  Cross-site SVG files are permitted.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThere is no existing JSON sniffer, but it is necessary because many existing JavaScript files are mislabeled as JSON.  We have implemented a basic sniffer.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo preserve compatibility, we are aiming to avoid disrupting the behavior of existing web sites when blocking responses, within reasonable limits.  We consider certain behavior changes acceptable, though.  For example, we prevent actual HTML, XML, or JSON files from being parsed as CSS.  CSS parsers were originally very lenient and could discover \"rules\" from almost any content, which was used by security researchers for attacks [1].  CSS now requires a valid MIME type, though, so it should be unaffected by the proposed blocking behavior.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen measuring the potential impact of the policy, we discovered several \"non-disruptive\" cases in which cross-site documents were blocked but that cause no behavior change to the page.  These include:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eResponses with error status codes in any context except images.  (Images continue to render regardless of status code, and this is sometimes used in practice for 404 images.)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eResponses that could not have been parsed for the target.  For example, files sniffed as HTML cannot be parsed as JavaScript, and non-SVG text files cannot be parsed as images.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eWe consider it harmless to block such network responses.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe only plan to enforce the policy on web renderer processes.  Extension processes in Chrome are allowed to request more documents (based on the host permissions in the extension's manifest), and we could later enforce a similar policy that accounts for their permissions.  Plugin processes currently have an exception as well since their requests currently go through the renderer process, but this will be changed in https://crbug.com/778711.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eUnfortunately, we do have to give up some security properties when extensions with content scripts are installed.  Such extensions can request permission in their manifest to make XmlHttpRequests to other sites from within the renderer process.  We cannot block such documents from the renderer process, which would allow an exploited renderer to also access such documents.  We are investigating how to update the content script security model to make this less of a concern in practice.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Compatibility-Results\" /\u003eCompatibility Results\u003c/h3\u003e\u003cdiv\u003eTo measure compatibility, we ran an experiment that collected user metrics on how many network responses would be blocked using our policy.  Our experiment followed the policy described above, with two caveats.  First, it incorrectly blocks cross-site SVG files.  Second, it incorrectly blocks cross-site requests made by extension content scripts.  Using one week of data collected from Chrome Beta users (using Chrome's opt-in UMA system), we found that 0.16% of network responses were blocked overall, but more than half of these we could prove to be non-disruptive (e.g., error status code).  Only 0.075% of network responses were potentially disruptive.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe intend to refine our experiment to avoid blocking content scripts and SVG files.  Based on the data we collected, we found that content scripts could account for up to 0.009% of responses.  Accounting for SVG files could let us conclude that up to another 0.063% of responses were not disruptive.  This suggests that our updated policy could be disruptive for as few as 0.003% of network responses.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eUsing these results, we have started to deploy the policy to users who have Site Isolation enabled in Chrome 63.  In combination with our other Site Isolation work, this can help protect confidential documents from leaking to other sites.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Current-Policy\" /\u003eCurrent Policy\u003c/h3\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eThe current document blocking policy protects HTTP responses for URLs labeled with one of these MIME types in the \"\u003cfont face\u003d\"courier new, monospace\"\u003eContent-Type\u003c/font\u003e\" HTTP response header:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/html\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/xml\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eapplication/xml\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eapplication/rss+xml\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eapplication/json\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/json\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/x-json\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etext/plain\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eThe HTTP response should also have a \"\u003cfont face\u003d\"courier new, monospace\"\u003eX-Content-Type-Options: nosniff\u003c/font\u003e\" HTTP response header, which ensures that the protection will not depend on what the contents of the file look like.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eNote that we recommend not supporting \u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests\" rel\u003d\"nofollow\"\u003emultipart range requests\u003c/a\u003e for sensitive documents, because this changes the MIME type to \u003cfont face\u003d\"courier new, monospace\"\u003emultipart/byteranges\u003c/font\u003e and makes it harder for Chrome to protect.\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003eIn addition to the recommended cases above, Chrome will also do its best to protect responses labeled with any of the MIME types above and without a \"nosniff\" header, but this has limitations.  Many JavaScript files on the web are unfortunately labeled using some of these MIME types, and if Chrome blocked access to them, existing websites would break.  Thus, when the \"nosniff\" header is not present, Chrome first looks at the start of the file to try to confirm whether it is HTML, XML, or JSON, before deciding to protect it.  If it cannot confirm this, it allows the response to be received by the cross-site page's process.  This is a best-effort approach which adds some limited protection while preserving compatibility with existing sites.  We recommend that web developers include the \"nosniff\" header to avoid relying on this approach.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Presentation\" /\u003ePresentation\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-on sites-embed\" style\u003d\"width:555px;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eTech Talk: Cross-Site Document Blocking\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-object-title\" style\u003d\"display:none;\"\u003eTech Talk: Cross-Site Document Blocking\u003c/div\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-punch\"\u003e\u003ciframe src\u003d\"http://docs.google.com/presentation/d/1LYCDTL5lWufTCHwxv9wvAMxW117ZxcUPViixZe4DRBs/embed?hl\u003den\u0026amp;size\u003dm\" width\u003d\"555\" height\u003d\"445\" title\u003d\"Tech Talk: Cross-Site Document Blocking\" frameborder\u003d\"0\" id\u003d\"533707201\" allowfullscreen\u003d\"true\" mozallowfullscreen\u003d\"true\" webkitallowfullscreen\u003d\"true\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-References\" /\u003eReferences\u003c/h3\u003e\u003cdiv\u003e[1] Huang, Lin-Shung, et al. \"Protecting browsers from cross-origin CSS attacks.\" Proceedings of the 17th ACM conference on Computer and communications security. ACM, 2010.\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/blocking-cross-site-documents"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1517618730316225879"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1517618730316225879"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1517618730316225879"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"blocking-cross-site-documents"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5078128050674247814"},"published":{"$t":"2015-06-10T18:21:47.968Z"},"updated":{"$t":"2018-05-29T15:27:10.719Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-29T15:27:10.719Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Ticket Milestone Punting"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;line-height:1.15;margin-top:24pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cdiv /\u003e\u003c/span\u003e\u003c/h1\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;line-height:1.15;margin-top:24pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eOverview\u003c/span\u003e\u003c/h1\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eChromium issue tickets get labelled for the earliest Chrome milestone they can get a fix into (or hope to get a fix into). Eg: label \"M-41\". However, once the target milestone reaches its branch date leading up to Beta Channel release (splits off from trunk), the gateway for getting changes into the milestone branch becomes much more controlled. This is an important part of the process to get the branch stabilized before it hits Stable Channel.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003eFor related reference: \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/the-zen-of-merge-requests\" style\u003d\"font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003eThe Zen of Merge Requests\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:medium;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eAs a result of this milestone branch state, we start to automatically push (punt) open tickets that are marked for this milestone into the next one. We do this automatically based on the labels that have been applied to the ticket.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe purpose of this page is to document the punting label logic, which defines whether an issue fix meets priority requirements to still potentially make it into the branched milestone.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003eIt is very important that we work together to keep post-branch changes/merges to a minimum. We need to do the best job possible to stabilize the milestone branches before they hit our users on stable channel. Please do not introduce unnecessary change and risk by inaccurately labeling your tickets, in the hopes of getting a merge. \u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eLabels that will NOT get auto punted from the post-branch milestone\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003ePri\u003d0\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dBug-Regression\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dBug-Security\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dPrivacyReview\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dSecurityReview\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dLaunch-Accessibility\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dLaunch-Experiment\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eType\u003dLaunch,Launch-OWP\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eMerge\u003dApproved,Requested,Merged\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003elabel:merge-merged  \u003ci\u003e(leave tickets that have already been merged to a branch \"merge-merged-X\")\u003c/i\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003ehas:ReleaseBlock \u003ci\u003e    (leave tickets that have any \"ReleaseBlock-X\" label)\u003c/i\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003elabel:Blocks               \u003ci\u003e(leave tickets that have a ChromeOS \"Blocks-X\" label)\u003c/i\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eReview\u003dSecurity,Privacy\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent\"\u003eiOS\u003dMerge-Approved,Merge-Requested \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e(Note: tickets could still be manually rejected.)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/ticket-milestone-punting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5078128050674247814"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5078128050674247814"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5078128050674247814"}],"author":[{"name":{"$t":"Jonathan Garbee"},"email":{"$t":"jonathan.garbee@chromium.org"}}],"sites$pageName":{"$t":"ticket-milestone-punting"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"UCl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2648953669066495398"},"published":{"$t":"2014-02-12T05:55:47.893Z"},"updated":{"$t":"2018-05-28T01:47:40.916Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-10T09:06:54.880Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Garbage Collection for Blink C++ objects (a.k.a. Oilpan)"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003cdiv\u003eThis documentation was moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/platform/heap/BlinkGCAPIReference.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/platform/heap/BlinkGCAPIReference.md\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2023764670965291136"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/blink-gc"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2648953669066495398"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2648953669066495398"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2648953669066495398"}],"author":[{"name":{"$t":"Kent Tamura"},"email":{"$t":"tkent@chromium.org"}}],"sites$pageName":{"$t":"blink-gc"},"sites$revision":{"$t":"49"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7900702491064177405"},"published":{"$t":"2015-07-06T01:21:22.064Z"},"updated":{"$t":"2018-05-25T05:16:32.937Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-25T05:16:30.395Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Worker Team"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe Blink Worker team works on Worker Threads in Blink, including \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/blink/serviceworker\"\u003eService Worker\u003c/a\u003e, Shared Worker, and Dedicated Worker.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:large\"\u003eCharter\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3332996368408px\"\u003eOur team's responsibility is to own, evolve and maintain (Dedicated/Shared/Service)Worker and Worklet infrastructure:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3332996368408px\"\u003ecore/workers/*\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3332996368408px\"\u003emodules/serviceworker/*\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3332996368408px\"\u003econtent/*/*worker*\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eDocs\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1i3IA3TG00rpQ7MKlpNFYUF6EfLcV01_Cv3IYG_DjF7M/edit#heading\u003dh.7smox3ra3f6n\"\u003eWeb Workers in Blink (Google Doc)\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://docs.google.com/presentation/d/15bHnAocAoSxYJAsF5JET34zMbzlxkc_NKGmP9BamqsM/edit#slide\u003did.g9e4def4c1_0_35\"\u003eService Workers: deep dive (BlinkOn4 slides)\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large;background-color:transparent\"\u003e\u003cb\u003eMailing list\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:13.3333px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eworker-dev@chromium.org\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5333416033998729085"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/teams/worker-team"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7900702491064177405"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7900702491064177405"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7900702491064177405"}],"author":[{"name":{"$t":"Matt Falkenhagen"},"email":{"$t":"falken@chromium.org"}}],"sites$pageName":{"$t":"worker-team"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8310636036839183285"},"published":{"$t":"2018-05-24T19:55:50.334Z"},"updated":{"$t":"2018-05-24T19:55:50.343Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-24T19:55:50.334Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Daily Actives - Update May 24.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8310636036839183285"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Daily%20Actives%20-%20Update%20May%2024.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8310636036839183285"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8310636036839183285"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8310636036839183285"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8310636036839183285"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4558171195545802633"},"published":{"$t":"2018-05-24T19:55:10.681Z"},"updated":{"$t":"2018-05-24T19:55:10.688Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-24T19:55:10.681Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Flash Volume - Update May 24.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4558171195545802633"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/983518581610832010"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/flash-roadmap/flash-usage-trends/Flash%20Volume%20-%20Update%20May%2024.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4558171195545802633"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4558171195545802633"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4558171195545802633"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4558171195545802633"}],"author":[{"name":{"$t":"Anthony LaForge"},"email":{"$t":"laforge@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6066730361560854403"},"published":{"$t":"2014-12-13T00:27:53.102Z"},"updated":{"$t":"2018-05-23T20:41:20.540Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-23T20:41:18.109Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Marking HTTP As Non-Secure"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003eThis page contains the original proposal for marking HTTP as non-secure (see Original Proposal below).\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003eSince then, the \u003ca href\u003d\"https://www.chromium.org/Home/chromium-security/enamel\"\u003eChrome usable security team\u003c/a\u003e has announced the following phases towards this goal.\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003eFor more information see, the WebFundamentals artic\u003cfont size\u003d\"2\"\u003ele: \u003cspan style\u003d\"color:rgb(0,102,204);font-family:Arial;white-space:pre-wrap;background-color:transparent\"\u003e\u003ca href\u003d\"https://developers.google.com/web/updates/2016/10/avoid-not-secure-warn\"\u003eAvoiding the Not Secure Warning in Chrome\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003c/p\u003e\u003chr style\u003d\"font-size:13.3333px\" /\u003e\u003cp style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\r\n\u003c/p\u003e\u003cp style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"5\"\u003eTimeline\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:15px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cb\u003eJanuary 2017 (Phase 1)\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003eTakes effect: January 2017 (Chrome 56)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003eAnnouncement: \u003ca href\u003d\"https://security.googleblog.com/2016/09/moving-towards-more-secure-web.html\"\u003eMoving towards a more secure web\u003c/a\u003e (September 8, 2016)\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003eIn this phase, HTTP pages will be marked with \"Not Secure\" in the URL bar under the following conditions:\u003c/font\u003e\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eThe page \u003cb\u003econtains a\u003c/b\u003e\u003c/font\u003e\u003cb\u003e \u003cspan style\u003d\"font-size:small\"\u003epassword\u003c/span\u003e\u003c/b\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e field\u003c/b\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe user \u003cb\u003einteracts with a \u003c/b\u003e\u003c/span\u003e\u003cb style\u003d\"font-size:small\"\u003ecredit card\u003c/b\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e field\u003c/b\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/blog%20image%201.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"156\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1504214353390/Home/chromium-security/marking-http-as-non-secure/blog%20image%201.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eOctober 2017 (Phase 2)\u003c/b\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003eTakes effect: October 2017 (Chrome 62)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eAnnouncement: \u003ca href\u003d\"https://security.googleblog.com/2017/04/next-steps-toward-more-connection.html\"\u003eNext Steps Toward More Connection Security\u003c/a\u003e (April 27, 2017)\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:small\"\u003eIn this phase, HTTP pages will be\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e marked with \"Not Secure\" in the URL bar under the following conditions:\u003c/span\u003e\u003c/p\u003e\r\n\u003cul style\u003d\"font-size:13.3333px\"\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eThe user is browsing in Chrome \u003ca href\u003d\"https://support.google.com/chromebook/answer/95464\"\u003e\u003cb\u003eincognito mode\u003c/b\u003e\u003c/a\u003e.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont size\u003d\"2\"\u003eThe page \u003cb\u003econtains a\u003c/b\u003e\u003c/font\u003e\u003cb\u003e \u003cspan style\u003d\"font-size:small\"\u003epassword\u003c/span\u003e\u003c/b\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e field\u003c/b\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe user \u003cb\u003einteracts with \u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003eany input field\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/form-and-incognito-http-bad-verbose.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"150\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1504214520221/Home/chromium-security/marking-http-as-non-secure/form-and-incognito-http-bad-verbose.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eOn mobile, there is no room for the string, so only the icon animates out for user entered data:\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cimg height\u003d\"320\" src\u003d\"https://lh6.googleusercontent.com/o8gRCMfszCh_ut-ED6vM_GwprRwi5bi3uvdOgVbCZr74N6ZahKXN4IgtkGB9lGVa6dJOPC6HRdMwHHv0Dpaq-0QmEcHFeOza4I4Av8fSYA5eYD3qKG960hb5msau5DSG8zhJtKsSexk\" style\u003d\"background-color:transparent;font-size:10pt\" width\u003d\"180\" /\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003eJuly 2018 (Phase 3)\u003c/b\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003eTakes effect: July 2018 (Chrome 68)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eAnnouncement: \u003ca href\u003d\"https://security.googleblog.com/2018/02/a-secure-web-is-here-to-stay.html\"\u003eA secure web is here to stay\u003c/a\u003e (February 8, 2018)\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIn this phase, all HTTP pages will be\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e marked with \"Not Secure\":\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/form-and-incognito-http-bad-verbose.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003c/span\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/form-and-incognito-http-bad-verbose.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/phase-3-wide.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"141\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1518648816859/Home/chromium-security/marking-http-as-non-secure/phase-3-wide.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003eOn mobile, there is no room for the string. The (i) icon will show on all HTTP pages:\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\" /\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cspan\u003e\u003cimg height\u003d\"80\" src\u003d\"https://lh6.googleusercontent.com/WLxC0fxWjNDw524vjorHcqnSSzR_hkJqZVogkFpka9fut6J_BS9UBip4BGPNWicQTH52A8Diae2j67JcziEJ8XrpHmLXnKagCLOZLvWAEHJ33ftTBVe9ZjurdLMw-kbnAbFcWkBE6bg\" width\u003d\"400\" /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eSeptember 2018\u003c/b\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"font-size:13.3333px;white-space:pre-wrap\"\u003eTakes effect: \u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSeptember 2018\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;white-space:pre-wrap\"\u003e (Chrome 69)\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eAnnouncement: \u003ca href\u003d\"https://blog.chromium.org/2018/05/evolving-chromes-security-indicators.html\"\u003eEvolving Chrome's security indicators\u003c/a\u003e (May 17, 2018)\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eIn this phase, secure pages will be marked more neutral instead of affirmatively secure\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:13.3333px;display:block;text-align:left\"\u003e\u003cspan\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/http-bad-sep-2018.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1526630154356/Home/chromium-security/marking-http-as-non-secure/http-bad-sep-2018.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/span\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003eOctober 2018\u003c/b\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"font-size:13.3333px;white-space:pre-wrap\"\u003eTakes effect: \u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eOctober 2018\u003c/span\u003e\u003cspan style\u003d\"font-size:13.3333px;white-space:pre-wrap\"\u003e (Chrome 70)\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eAnnouncement: \u003ca href\u003d\"https://blog.chromium.org/2018/05/evolving-chromes-security-indicators.html\"\u003eEvolving Chrome's security indicators\u003c/a\u003e (May 17, 2018)\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13.3333px;line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:small\"\u003eIn this phase, HTTP pages will be\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e marked as affirmatively \"Not Secure\" using red color and the non-secure icon in the URL bar if t\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003ehe user \u003cb\u003einteracts with \u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cb\u003eany input field\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://3.bp.blogspot.com/-MkJEkHnXcXc/Wv181DQednI/AAAAAAAAA6E/95MwjxqK7awaCgr_Z6xRNWVi0Ztf0-ncACLcBGAs/s1600/Treatment%2Bof%2BHTTP%2BPages%2Bwith%2BUser%2BInput.gif\" imageanchor\u003d\"1\" rel\u003d\"nofollow\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://3.bp.blogspot.com/-MkJEkHnXcXc/Wv181DQednI/AAAAAAAAA6E/95MwjxqK7awaCgr_Z6xRNWVi0Ztf0-ncACLcBGAs/s1600/Treatment%2Bof%2BHTTP%2BPages%2Bwith%2BUser%2BInput.gif\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cb style\u003d\"font-size:15px\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cb style\u003d\"font-size:15px\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cb style\u003d\"font-size:15px\"\u003eEventual\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cb style\u003d\"font-size:15px\"\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003eThere is no target date for the final state yet, but we intend to mark all HTTP pages as affirmatively non-secure in the long term (the same as other non-secure pages, like pages with broken HTTPS):\u003c/p\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cb style\u003d\"font-size:15px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/blog%20image%202.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"194\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1504214559418/Home/chromium-security/marking-http-as-non-secure/blog%20image%202.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eOn mobile:\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cspan\u003e\u003cimg height\u003d\"81\" src\u003d\"https://lh3.googleusercontent.com/U3QsL4ZZlAZOBejvGlmo0RMgZpnXEmzj_JZDcZoqUeX7q9UTHCLlRxoweNKY9F8lNj3h9GzrwaSKIaxOI0pRzmZ60X7N6taxTsw_ygpI5HobP0DEOzDnhwGLxn9kmgjUNSI6-CakhFg\" width\u003d\"320\" /\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003chr /\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont size\u003d\"5\"\u003eOriginal Proposal\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eProposal\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe, the Chrome Security Team, propose that user agents (UAs) \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003egradually change their UX to display non-secure origins as affirmatively non-secure\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e. \u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eThe goal of this proposal is to more clearly display to users that HTTP provides no data security.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eRequest\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe’d like to hear everyone’s thoughts on this proposal, and to discuss with the web community about how different transition plans might serve users.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eBackground\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe all need data communication on the web to be secure (private, authenticated, untampered). When there is no data security, the UA should explicitly display that, so users can make informed decisions about how to interact with an origin.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eRoughly speaking, there are three basic transport layer security states for web origins:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eSecure\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e (valid HTTPS, other origins like (*, localhost, *));\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eDubious\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e (valid HTTPS but with mixed passive resources, valid HTTPS with minor TLS errors); and\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eNon-secure\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e (broken HTTPS, HTTP).\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eFor more precise definitions of \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003esecure\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003enon-secure\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e, see \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/TR/powerful-features/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eRequirements for Powerful Features\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e and \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/TR/mixed-content/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eMixed Content\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe know that active tampering and surveillance attacks, as well as passive surveillance attacks, are not theoretical but are in fact commonplace on the web.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://tools.ietf.org/html/rfc7258\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eRFC 7258: Pervasive Monitoring Is an Attack\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.washingtonpost.com/blogs/the-switch/wp/2013/12/10/nsa-uses-google-cookies-to-pinpoint-targets-for-hacking/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eNSA uses Google cookies to pinpoint targets for hacking\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.wired.com/2014/10/verizons-perma-cookie/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eVerizon’s ‘Perma-Cookie’ Is a Privacy-Killing Machine\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://stackoverflow.com/questions/25438910/how-bad-is-it-to-replace-adsense-code-id-to-isps-adsense-id-on-free-internet\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eHow bad is it to replace adSense code id to ISP's adSense ID on free Internet?\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://arstechnica.com/tech-policy/2014/09/why-comcasts-javascript-ad-injections-threaten-security-net-neutrality/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eComcast Wi-Fi serving self-promotional ads via JavaScript injection\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://tools.ietf.org/html/draft-hildebrand-middlebox-erosion-01\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eErosion of the moral authority of transparent middleboxes\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://w3ctag.github.io/web-https/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eTransitioning The Web To HTTPS\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe know that \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003epeople do not generally perceive the absence of a warning sign\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e. (See e.g. \u003c/span\u003e\u003ca href\u003d\"http://commerce.net/wp-content/uploads/2012/04/The%20Emperors_New_Security_Indicators.pdf\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eThe Emperor's New Security Indicators\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e.) Yet the only situation in which web browsers are guaranteed not to warn users is precisely when there is no chance of security: when the origin is transported via HTTP. Here are screenshots of the status quo for non-secure domains in Chrome, Safari, Firefox, and Internet Explorer:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cimg alt\u003d\"Screen Shot 2014-12-11 at 5.08.48 PM.png\" height\u003d\"71px;\" src\u003d\"https://lh3.googleusercontent.com/iqplifxSx_wSl7SIq6UVlYg6PdxJxgCAoF-6D06PPfC3CN9GZE0NzeWF72jRa4wi2E2ACnt9L24-sv69phA8WCBhVQGlYqlV1YUxlaJU3_8OwQNxzM4AJK6dE4k_-X8n5g\" style\u003d\"border:none\" width\u003d\"243px;\" /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cimg alt\u003d\"Screen Shot 2014-12-11 at 5.09.55 PM.png\" height\u003d\"77px;\" src\u003d\"https://lh5.googleusercontent.com/YJAUDzAEAiaRpWRKa9qVaPly5eb6uwy909VH3OoINMwub7fz_KHrrPrLjHIi42KUt8l-VSmrFpjeTN5xTaZskhfsIoldczpw5eJNY6yLMYoA4wa2Ij-_rGz6oNM5mSVerA\" style\u003d\"border:none\" width\u003d\"254px;\" /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cimg alt\u003d\"Screen Shot 2014-12-11 at 5.11.04 PM.png\" height\u003d\"86px;\" src\u003d\"https://lh6.googleusercontent.com/QuA9DeqhXn8Cx9gTRBfYZmseK1Qz53apbMSylUgAcJCCzBsZ55pLllipWZxK9e4yQ_zJbFEuDJPnbJzMZxe59FCfMEqWPC0HDNfq3-65ebsbQ344n6U16PpXYc3cZ_sKkg\" style\u003d\"border:none\" width\u003d\"328px;\" /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cimg alt\u003d\"ie-non-secure.png\" height\u003d\"61px;\" src\u003d\"https://lh6.googleusercontent.com/0R7HobJqifX3DqOAMzKcfb72lbyJbew5H3VWGLijftRNuEM76cwRzQAX_Zk461w6dVjFNXGf7nQ0J8uOrIsSTmsUaaauNZGtV2CEEXJZkY7ncw75y8N8si1LcK6JOjxofg\" style\u003d\"border:none\" width\u003d\"624px;\" /\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eParticulars\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eUA vendors who agree with this proposal should decide how best to phase in the UX changes given the needs of their users and their product design constraints. Generally, we suggest a phased approach to marking non-secure origins as non-secure. For example, a UA vendor might decide that in the medium term, they will represent non-secure origins in the same way that they represent Dubious origins. Then, in the long term, the vendor might decide to represent non-secure origins in the same way that they represent Bad origins.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eUltimately, we can even imagine a long term in which secure origins are so widely deployed that we can leave them unmarked (as HTTP is today), and mark only the rare non-secure origins.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eThere are several ways vendors might decide to transition from one phase to the next. For example, the transition plan could be time-based:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eT0 (now): Non-secure origins unmarked\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eT1: Non-secure origins marked as Dubious\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eT2: Non-secure origins marked as Non-secure\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eT3: Secure origins unmarked\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eOr, vendors might set thresholds based on telemetry that measures the ratios of user interaction with secure origins vs. non-secure. Consider this strawman proposal:\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eSecure \u0026gt; 65%: Non-secure origins marked as Dubious\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eSecure \u0026gt; 75%: Non-secure origins marked as Non-secure\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-size:15px;font-family:Arial;vertical-align:baseline;background-color:transparent\"\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eSecure \u0026gt; 85%: Secure origins unmarked\u003c/span\u003e\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eThe particular thresholds or transition dates are very much up for discussion. Additionally, how to define “ratios of user interaction” is also up for discussion; ideas include the ratio of secure to non-secure page loads, the ratio of secure to non-secure resource loads, or the ratio of total time spent interacting with secure vs. non-secure origins.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWe’d love to hear what UA vendors, web developers, and users think. Thanks for reading! We are discussing the proposal on web standards mailing lists:\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;line-height:17.25px;white-space:pre-wrap;background-color:transparent\"\u003e\u003ca href\u003d\"http://lists.w3.org/Archives/Public/public-webappsec/\" rel\u003d\"nofollow\"\u003epublic-webappsec@w3.org\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;line-height:17.25px;white-space:pre-wrap;background-color:transparent\"\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/blink-dev\"\u003eblink-dev@chromium.org\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;line-height:17.25px;white-space:pre-wrap;background-color:transparent\"\u003e\u003ca href\u003d\"https://groups.google.com/a/chromium.org/forum/#!forum/security-dev\"\u003esecurity-dev@chromium.org\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;line-height:17.25px;white-space:pre-wrap;background-color:transparent\"\u003e\u003ca href\u003d\"https://groups.google.com/forum/#!forum/mozilla.dev.security\"\u003edev-security@lists.mozilla.org\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eFAQ\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWe have fielded various reasonable concerns about this proposal, but most of them have a good answer. Here is a brief selection.\u003c/div\u003e\r\n\u003cdiv\u003e(Please consider any external links to be examples, not endorsements.)\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eWill this break plain HTTP sites?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eNo. HTTP sites will continue to work; we currently have no plans to block them in Chrome. All that will change is the \u003ci\u003esecurity indicator(s)\u003c/i\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003eAren't certificates expensive/difficult to obtain?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eA few providers currently provide free/cheap/bundled certificates right now. The \u003ca href\u003d\"https://letsencrypt.org/\" rel\u003d\"nofollow\"\u003eLet's Encrypt\u003c/a\u003e project makes it easy to obtain free certificates (even for many subdomains at once, or with wildcards).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003eAren't certificates difficult to set up?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eLet's Encrypt has developed a \u003ca href\u003d\"https://letsencrypt.org/howitworks/\" rel\u003d\"nofollow\"\u003esimple, open-source protocol\u003c/a\u003e for setting up server certificates. \u003ca href\u003d\"https://sslmate.com/\" rel\u003d\"nofollow\"\u003eSSLMate\u003c/a\u003e currently provides a similar service for a fee. Services like \u003ca href\u003d\"http://blog.cloudflare.com/introducing-universal-ssl/\" rel\u003d\"nofollow\"\u003eCloudflare\u003c/a\u003e currently provide free SSL/TLS for sites hosted through them, and hosting providers may start automating this for all users once free certificates become common.\u003c/li\u003e\u003cli\u003eFor people who are happy without a custom domain, there are various hosting options that support HTTPS with a free tier, e.g. \u003ca href\u003d\"https://pages.github.com/\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eGitHub Pages\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, blogging services, \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/\" style\u003d\"background-color:transparent;font-size:10pt\" rel\u003d\"nofollow\"\u003eGoogle Sites\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e, and \u003c/span\u003e\u003ca href\u003d\"https://cloud.google.com/appengine/\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eGoogle App Engine\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e. As of 2018, many hosting providers even support turning on HTTPS using a single checkbox.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003eIsn't SSL/TLS slow?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://istlsfastyet.com/\" rel\u003d\"nofollow\"\u003eNot really\u003c/a\u003e (for almost all sites, if they are following good practices).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003eDoesn't this break caching? Filtering?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eIf you're a site operator concerned about site load, there are various secure CDN options available, starting as cheap as \u003ca href\u003d\"http://blog.cloudflare.com/introducing-universal-ssl/\" rel\u003d\"nofollow\"\u003eCloudflare's free tier\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eFor environments that need tight control of internet access, there are several client-side/network solutions. For other environments, we consider this kind of tampering a violation of SSL/TLS security guarantees.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003eWhat about test servers/self-signed certificates?\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eHopefully, free/simple certificate setup will be able to help people who had previously considered it inconvenient. Also note that \u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features\"\u003elocalhost is considered secure\u003c/a\u003e, even without HTTPS.\u003c/li\u003e\r\n\u003cli\u003eAs mentioned above, plain HTTP will continue to work.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003eAlso see \u003ca href\u003d\"https://blog.mozilla.org/security/files/2015/05/HTTPS-FAQ.pdf\" rel\u003d\"nofollow\"\u003eMozilla's FAQ\u003c/a\u003e on this topic for longer answers.\u003c/div\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6066730361560854403"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6066730361560854403"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6066730361560854403"}],"author":[{"name":{"$t":"Chris Palmer"},"email":{"$t":"palmer@chromium.org"}}],"sites$pageName":{"$t":"marking-http-as-non-secure"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6271830753724372848"},"published":{"$t":"2018-05-18T07:57:57.493Z"},"updated":{"$t":"2018-05-18T07:58:50.896Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-18T07:58:50.879Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Treatment of HTTP Pages with User Input.gif"},"summary":{},"content":{"type":"image/gif","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6271830753724372848"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6066730361560854403"},{"rel":"alternate","type":"image/gif","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/Treatment%20of%20HTTP%20Pages%20with%20User%20Input.gif"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6271830753724372848"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6271830753724372848"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6271830753724372848"},{"rel":"edit-media","type":"image/gif","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6271830753724372848"}],"author":[{"name":{"$t":"Lucas Garron"},"email":{"$t":"lgarron@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6022237172990114160"},"published":{"$t":"2018-05-18T07:55:54.324Z"},"updated":{"$t":"2018-05-18T07:55:54.356Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-18T07:55:54.324Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"http-bad-sep-2018.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6022237172990114160"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6066730361560854403"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/marking-http-as-non-secure/http-bad-sep-2018.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6022237172990114160"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6022237172990114160"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6022237172990114160"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6022237172990114160"}],"author":[{"name":{"$t":"Lucas Garron"},"email":{"$t":"lgarron@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2748326519206818094"},"published":{"$t":"2009-11-19T17:03:43.904Z"},"updated":{"$t":"2018-05-16T15:41:33.845Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-16T15:41:30.592Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Verified Boot"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Abstract\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eAbstract\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Goals-of-verified-boot\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eGoals of verified boot\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Getting-to-the-kernel-safely\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eGetting to the kernel safely\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Extending-verification-from-the-ker\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eExtending verification from the kernel on upward\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Known-weaknesses-of-verified-boot\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eKnown weaknesses of verified boot\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mitigating-potential-bottlenecks\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eMitigating potential bottlenecks\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Handling-updates\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eHandling updates\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-The-implementation\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eThe implementation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Other-issues-ideas-and-notes\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eOther issues, ideas, and notes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Attack-cases\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eAttack cases\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003eAbstract\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;border-collapse:collapse\"\u003eThe Chromium OS team is implementing a verified boot solution that strives to ensure that users feel secure when logging into a Chromium OS device. Verified boot starts with a read-only portion of firmware, which only executes the next chunk of boot code after verification.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;border-collapse:collapse\"\u003eVerified boot strives to ensure that all executed code comes from the Chromium OS source tree, rather than from an attacker or corruption.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eVerified boot is focused on stopping the opportunistic attacker. While verified boot is not expected to detect every attack, the goal is to be a significant deterrent which will be improved upon iteratively.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eVerification during boot is performed on-the-fly to avoid delaying system start up.  It uses stored cryptographic hashes and may be compatible with any trusted kernel.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eThis document extends and expands on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/firmware-boot-and-recovery\"\u003eFirmware Boot and Recovery\u003c/a\u003e, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot-crypto\"\u003eVerified Boot Crypto\u003c/a\u003e, and \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot-data-structures\"\u003eVerified Boot Data Structures\u003c/a\u003e documents.\u003c/p\u003e\r\nVerified\r\nBoot should provide a mechanism that aids the user in detecting when\r\ntheir system is in need of recovery due to boot path changes. In particular, it should meet these requirements:\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eDetect non-volatile memory changes from expected state (rw firmware)\u003c/li\u003e\r\n\u003cli\u003eDetect file system changes relevant to system boot (kernel, init, modules, fs metadata, policies)\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eSupport functionality upgrades in the field\u003c/li\u003e\u003c/ul\u003e\r\nIt is important to note that\r\nrestraining the boot path to only Chromium-project-supplied code is not a\r\ngoal. The focus is to ensure that when code is run that is not\r\nprovided for or maintained by upstream, that the user will have the\r\noption to immediately reset the device to a known-good state. Along\r\nthese lines, there is no dependence on remote attestation or other\r\nexternal authorization. Users will always own their computers.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Goals-of-verified-boot\" /\u003eGoals of verified boot\u003cbr /\u003e\r\n\u003c/h2\u003e\r\nThe primary attacker in this model is an opportunistic attacker. This means that the attacker has accessed the system using:\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003ea remote vector, such as the Chromium-based browser or a browser plugin\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003ea local vector, such as booting to a USB drive and changing files (but \u003cb\u003enot\u003c/b\u003e by replacing the write-protected firmware)\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\nIf we assume attackers access the system via a remote vector and bypass all run-time defenses, then they will have access to modify the root partition (kernel, modules, browser, ...), update read-write firmware, inject code into SMRAM, and so on. In addition,\r\nthe attacker can now access any data in the currently-logged-in user's\r\naccount such as locally stored media and website cookies. The attacker\r\nmay collect passwords when typed by the user into the Chromium-based browser or the\r\nscreenlocker.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nAn opportunistic \u003ci\u003elocal\u003c/i\u003e attacker will have a completely different level of access. Access will be achieved using a USB boot drive, or other out-of-band bootable material supported by the firmware. Once the system is running the attacker's operating system, she will be able to modify the root file system and encrypted user-data blobs. She won't have any visibility into the encrypted information but may copy it or modify it.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhile Chromium OS\r\ndoes as much as possible to guard against such remote and local breaches, no software\r\nsystem is impervious to successful attacks. Therefore, it is important\r\nthat the attacker cannot continue to \"own\" a machine through permanent, local changes. To that end, on\r\nboot, the firmware and other accessible regions of the system\r\ninternals are verified to be in a known good state. If they aren't,\r\nthen the firmware recovery process will be initiated (or the user can\r\nrequest permission to proceed, which would make sense in the case of a development install, for example).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe\r\nimportant factor to consider with the attackers considered above is that if\r\nan attacker gains access via the Chromium browser, they can presumably modify the Chromium browser's startup (or bookmarks or server-side settings) to re-attack\r\nthe machine at next reboot. This is why it is important to be able to\r\nensure that a safe recovery/reinstall is possible outside of what can\r\nbe done by an attacker on the machine. (Obviously, this is no\r\ndeterrent for a \u003cb\u003edetermined\u003c/b\u003e attacker willing to modify the system physically.)\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Getting-to-the-kernel-safely\" /\u003eGetting to the kernel safely\u003cbr /\u003e\r\n\u003c/h2\u003e\r\nAs\r\noutlined in the Firmware Boot and Recovery document, verification will\r\noccur in several places. Initially, the small read-only stub code will\r\ncompute a SHA-2 hash (either with internal code or using a provided\r\nSHA-2 accelerator) of the read-write portion of the firmware. An RSA\r\nsignature of this hash will then be verified using a permanently\r\nstored public key (of, \u003ca href\u003d\"http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57-Part1-revised2_Mar08-2007.pdf\" title\u003d\"ideally\" rel\u003d\"nofollow\"\u003eideally\u003c/a\u003e, 2048 bits or more).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe\r\nread-write firmware is then responsible for computing hashes of any\r\nother non-volatile memory and the kernel that will be executed. It will contain its own \u003ci\u003esubkey\u003c/i\u003e and a list of cryptographic hashes for the data to be verified: kernel, initrd, master boot record, and so on. These additional hashes will be signed by the subkey so that they may be updated without requiring the write-protected key to be used for every update. (Note, the kernel+initrd signed hashes may be stored with the kernel+initrd on disk to avoid needing a firmware update when they change.)\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nOnce we're in the kernel, we've successfully performed a verified boot.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Extending-verification-from-the-ker\" /\u003eExtending verification from the kernel on upward\u003cbr /\u003e\r\n\u003c/h2\u003e\r\nIn\r\ngeneral, once we're running, integrity measurements become less\r\nuseful. We can ensure that the Chromium browser that we execute has not been\r\ntampered with, but we can't guarantee that the same attack that\r\ncompromised it the first time won't compromise it a second time\r\nwithout updating.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nTo ensure that an update is possible, the executables, modules, and configuration files that allow the system to receive updates must be authentic and untampered with. Getting to that point requires network access and a running autoupdater. Given that Chromium OS keeps a very minimal root file system, it's easier to just verify everything on it.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhile that sounds great in theory, in practice it is hard to guarantee an intact file system without paying the cost for upfront checks. If the read-write firmware were to verify the entire root partition before proceeding to boot, it would add at least 5 seconds to the boot-time on current netbooks. This delay is untenable.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nInstead of performing full file system verification in advance, it can be done on demand from a verified kernel. A transparent block device will be layered between the run-time system and all running processes. It will be configured during kernel startup using either in-kernel code changes or from a firmware-verified initial ramdisk image. Each block that is accessed via the transparent block device layer will be checked against a cryptographic hash which is stored in a central collection of hashes for the verifiable block device.  This may be in a standalone partition or trailing the filesystem on the verifiable block device.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nInitially, blocks will be 4KB in size. For a root file system of roughly ~75MB, there will be roughly 19,200 SHA-1 hashes. On current x86 and ARM based systems, computing the SHA-1 hash of 4KB takes between 0.2ms and 0.5ms. There will be additional overhead (TBD) incurred by accessing the correct block hash and comparing the cryptographic digests.  Once verified, blocks should live in the page cache above the block layer. This will mean that verification does not occur on every read event. To further amortize time-costs, the block hashes will be segmented into logical bundles of block hashes. Each bundle will be hashed. The subsequent list of bundle hashes will then be hashed. This layering can be repeated as needed to build a tree.  The final, single hash will be hard coded into the kernel or supplied through a device interface from a trusted initial RAM disk.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"display:block;margin-top:5px;margin-right:auto;margin-bottom:0pt;text-align:left\"\u003e\u003cbr /\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003ca href\u003d\"http://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot/diag2.png?attredirects\u003d0\" imageanchor\u003d\"1\" rel\u003d\"nofollow\" /\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003ca href\u003d\"http://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot/diag2.png?attredirects\u003d0\" imageanchor\u003d\"1\" rel\u003d\"nofollow\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258650225205/chromium-os/chromiumos-design-docs/verified-boot/diag2png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nNote that SHA-1 is considered to be \u003ca href\u003d\"http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eunsafe after 2010 by NIST\u003c/a\u003e for general use. The biggest risk here is that specific block collisions can be found and made such that they provide an alternate execution path. We could use any hashing algorithm supported by the Linux kernel in our implementation. SHA-1 is just a specific example.\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Known-weaknesses-of-verified-boot\" /\u003eKnown weaknesses of verified boot\u003c/h2\u003e\u003cdiv\u003eWhile verified boot can ensure that the system image (i.e. firmware, kernel, root file system) are protected against tampering by attackers, it can't protect data that must inherently be modifiable by a running system. This includes user data, but also system-wide state such as system configuration (network, time zone, keyboard layout, etc.), cached data maintained by the system (VPD contents, metrics and crash reporting data, etc.). This state is generally kept on the writable stateful file system. In some cases, it is consumed by the boot process and may affect the behavior of the (verified) software. If an attacker manages to place malicious data on the stateful file system that will cause the verified code to \"take a wrong turn\", they may cause inadvertent side effects that may ultimately lead to the system getting exploited and thus defeating verified boot. The \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data\"\u003eHardening against malicious stateful data\u003c/a\u003e document discusses details and mitigations.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Mitigating-potential-bottlenecks\" /\u003eMitigating potential bottlenecks\u003cbr /\u003e\r\n\u003c/h2\u003e\r\nLoading hashes off the same disk as the data for each block would affect performance during a read. Right now, the plan is to read in signed bundles of hashes as blocks in that bundle range are accessed. Once a bundle is loaded into memory, it is kept there. If we assume that we're looking at something like 20k-hashes, then that will require around 400KB of memory. Even if the needed hashes grow to twice that, allocating 1MB of kernel memory doesn't seem too onerous. In addition, keeping the block hashes in memory will provide for easy linear addressing of the hashes since they will be in block-order.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Handling-updates\" /\u003eHandling updates\u003cbr /\u003e\r\n\u003c/h2\u003e\r\nFor Chromium OS, the autoupdater will update the collection of hashes specific to the partition it is updating.  In general, the complete collection of hashes for a specific partition will be generated by running a lightweight utility directly on the filesystem image. It will walk the origin block device and emit an image file that\r\ncontains the properly formatted hash collection. In addition, it will\r\nemit the SHA-1 hash of the bundle hashes. This will be the\r\nauthoritative hash that will need to be either signed or stored in a\r\nsigned/verified location, such as in the kernel. The resulting file can either be appended to the filesystem image or stored in a standalone partition (hash partition).    On update, a direct difference of the new hash collection can be taken using bsdiff against the last versions.  However, it may be that more efficient difference generation approaches may be used as long as the end result is the same.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-The-implementation\" /\u003eThe implementation\u003c/h2\u003e\r\nPost-firmware verified boot will most likely be implemented as a device mapper target. It will provide the transparent, verifying block layer. Initially, it will be assumed that there will be a verified initrd that can be used to set up the root partition using the dm device. A simple utility tool will be written that will directly hash a given block device and emit a compatible binary blob that contains the collection of hashes. It will take the format:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cfont face\u003d\"\u0026amp;apos;trebuchet ms\u0026amp;apos;\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n   hash\u003c/span\u003e\u003csub style\u003d\"font-family:courier new,monospace\"\u003eblock_1\u003c/sub\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e . . . hash\u003c/span\u003e\u003csub style\u003d\"font-family:courier new,monospace\"\u003eblock_n\u003c/sub\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\r\n   \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ehash\u003c/span\u003e\u003csub style\u003d\"font-family:courier new,monospace\"\u003ebundle_1\u003c/sub\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e. . . \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ehash\u003c/span\u003e\u003csub style\u003d\"font-family:courier new,monospace\"\u003ebundle_m\u003c/sub\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003cbr /\u003e\r\nThis data will live either in its own partition or be appended to the verified partition (aligned on a block boundary). Its location, the hash algorithm used, and the hash of bundle hashes should be passed in as arguments to the device mapper setup process (either using dmsetup from an initrd or directly in the kernel).\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eLiving implementation documentation can be found \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/kernel/+/master/Documentation/device-mapper/dm-verity.txt\"\u003ehere\u003c/a\u003e and \u003ca href\u003d\"https://chromium.googlesource.com/chromiumos/third_party/kernel/+/master/Documentation/device-mapper/dm-bht.txt\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Other-issues-ideas-and-notes\" /\u003eOther issues, ideas, and notes\u003cbr /\u003e\r\n\u003c/h2\u003e\r\n\u003cul\u003e\u003cli\u003eAll\r\nverification performed after the kernel is running should be\r\nindependent of the firmware verification. This allows for developers\r\nto run their own builds as well as for the boot-time verification to be\r\ncompatible with a TCG-style boot.\r\n\u003c/li\u003e\r\n\u003cli\u003eThe partition table should be validated to some extent by the read-write firmware, but if there are any kernel/firmware partition parsing bugs, we may be able to catch them with audits as well.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eVerified Boot can play nicely with the\r\nTPM. Once a signed kernel is up, it can initialize the TPM's PCR\r\nregisters and use those for measurement tracking. In particular, we\r\nhave the option of using it (Linux-IMA style) to perform disk\r\nencryption key protection and possibly even other pre-login state\r\nprotection where the key becomes available only if we've booted without\r\nmodification.\u003c/li\u003e\r\n\u003cli\u003eThe hash partition will be subject to\r\nreplay attack unless the kernel version that pairs with it is included\r\nin the file and the kernel is upgraded when the hashes are. However,\r\nthe kernel+initrd will suffer the same attack for the next level up.\r\nAvoiding replay/rollback attacks is non-trivial since the firmware can't guarantee the local clock is not changed. A local TPM tickstamp\r\nblob would need to be included in the signed hash payloads to solve the problem to some degree. If autoupdates\r\nwere customized per-download, this may be possible, but at present,\r\nthis is not planned.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\r\n\u003cli\u003eKey management is of utmost importance for the key used to sign the read-only firmware. That key should only be used on the R/W firmware which should be\r\nupdated much less frequently than the rest of the system. If possible,\r\nthis key should never be exposed on a network-enabled machine, but that is out of scope for this design.\u003c/li\u003e\r\n\u003cli\u003eHaving a fully tamper-evident root file system means that if desired, a manifest of service-specific public keys/certificates could be stored on the root partition. These keys could then be used to verify the authenticity and integrity any data stored on the stateful partition that was signed by a remote server (Google or another provider).\u003c/li\u003e\r\n\u003cli\u003eThere is no plan to support any remote inspection of whether a Chromium OS installation is using a 'verified boot' or a development version.\u003c/li\u003e\r\n\u003cli\u003eThe autoupdate process currently has a file-centric view. This means that it could be possible for file system layout to diverge across machines. If this is the case, block hashes may still be used, but a more file-centric view may be needed. If the updater moves towards file system image differencing, this design will work as is.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Attack-cases\" /\u003eAttack cases\u003c/h2\u003e\r\n\u003cp\u003eThis\r\nsection only discusses the current threat model, but many of the\r\nattacks can be generalized to other attack vectors. In addition, these\r\nscenarios ignore all other attack mitigation techniques not included in\r\nthe document above. In reality, various system-level and Chromium-level\r\ndefenses should aid in making run-time attacks difficult and unreliable.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eVector\u003c/i\u003e: Opportunistic local attacker with a USB stick or bootable SD card.\u003cbr /\u003e\r\n\u003ci\u003eScenario\u003c/i\u003e:\r\nAttacker boots the system off of an external boot device. The attacker then changes files and copies the entire system.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will detect this tampering. Encrypted user data will still be protected.\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eNone. User will need to recover their system.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eScenario\u003c/i\u003e:\r\nAttacker boots the system off of an external boot device and leaves the system running a \"fake\" Chromium OS to phish user data.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will not impact this \u003ci\u003eunless\u003cu\u003e \u003c/u\u003e\u003c/i\u003ethe user reboots the system before logging in.\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eNone to complete depending on if the user reboots prior to logging in. If the user left the machine at the screenlocker, a fake screenlocker could be used in the phishing OS since it is unlikely a user will reboot before unlocking. This may be addressed in the future with clever authentication use (PCR+TPM, ?). However, a paranoid user that left their machine in an unsafe place may just want to reboot to be safe.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eVector\u003c/i\u003e: Determined local attacker with a USB drive and a toolkit\u003cbr /\u003e\r\n\u003ci\u003eScenario\u003c/i\u003e:\r\nAttacker opens the system up and enables the write-pin on the write-protected firmware. The attacker then boots the system off of an external boot device. The root file system is changed along with the formerly write-protected and read-write firmware.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will operate normally and will not detect any variance.\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eComplete; a determined attacker that will physically modify the machine cannot be easily stopped. They may also install hardware keyboard sniffers, microphones, cameras, etc.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u003ci\u003eVector\u003c/i\u003e: Chromium or a Chromium plugin\u003cbr /\u003e\r\n\u003ci\u003eScenario\u003c/i\u003e:\r\nNo superuser privileges are gained, but the attacker can modify Chromium data. The attacker changes bookmarks, starting pages, marks their\r\npages as ok for popups, and disables safe browsing. In addition,\r\ncookies and stored passwords are harvested and posted to a remote\r\nserver.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot has no impact.\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eOnly the initially compromised user is exposed.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eScenario\u003c/i\u003e:\r\nAttacker gains superuser privileges. The attacker remounts root partition read-write directly. The attacker then replaces\r\n/usr/bin/chromeos-chrome with their own build of Chromium that includes\r\nmalware/illegal ad revenue and password/credit card sniffing.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will detect after the next reboot (not after a suspend to RAM).\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eUntil reboot, any user that logs in is exposed (password, cookies, encrypted data).\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eScenario\u003c/i\u003e: Attacker gains superuser privileges. The\r\nattacker remounts root partition read-write directly. The attacker then adds a kernel\r\nmodule in the form of a rootkit for the system to load on next reboot.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will detect after the next reboot.\u003cbr /\u003e\r\n\u003ci\u003eExposure: \u003c/i\u003eUntil reboot, any user that logs in is exposed (password, cookies, encrypted data).\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eScenario\u003c/i\u003e: Attacker gains superuser privileges. The attacker then modifies the encrypted file system metadata which exploits a file system bug in the kernel on next login.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot has no direct impact. However, if the autoupdater runs before next login, the vulnerability may be patched.\u003cbr /\u003e\r\n\u003ci\u003eExposure\u003c/i\u003e: On next login, the tampered with encrypted file system metadata attack will trigger.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eScenario\u003c/i\u003e:\r\nAttacker gains superuser privileges. The attacker then\r\nreplaces the hash-partition with an older version and replaces system image with one that has known vulnerabilities (which may be easier\r\nto exploit reliably than the vector used for attack). The attacker\r\nwill then change the current user's configuration to auto-open an\r\nattack URL to re-exploit the system immediately after reboot. If the\r\nattacker can gain superuser privileges repeatedly, then it will be difficult for autoupdate to repair.\u003cbr /\u003e\r\n\u003ci\u003eCoverage\u003c/i\u003e: Verified Boot will not be able to detect hash-partition\r\nreplay attacks easily. It may be possible to retroactively detect then\r\nby the autoupdater after the network is up, but an attacker will always\r\nbe able to the system appear to just be out-of-date.\u003cbr /\u003e\r\n\u003ci\u003eExposure\u003c/i\u003e: Any user that logs in is exposed across reboots.\u003cbr /\u003e\r\n\u003ci\u003eNotes\u003c/i\u003e: Downgrade/replay attacks of this nature will be less\r\ndangerous if autoupdater is able to run prior to Chromium starting, but\r\nthere will most likely be a race between the two. It may make sense to\r\ninclude a version check early in the Chromium startup process to detect\r\nseriously out-of-date browsers/systems prior to their opening dangerous\r\npages.\u003c/p\u003e\r\n\u003cp\u003e\u003ci\u003eExposure summary:\u003c/i\u003e\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eRun-time attacks against unsignable data: Chromium configuration\u003c/li\u003e\r\n\u003cli\u003ePersisted attacks by defaulting Chromium to launch the attack site on next start\u003c/li\u003e\r\n\u003cli\u003eLogged-in user data is exposed immediately after compromise.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eWith partial signing, a Chromium replacement would result in cross-user exposure after reboot.\u003c/li\u003e\r\n\u003cli\u003eWith full signing, other system users would be notified prior to exposure\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eMetadata attacks against the kernel will not be caught by signing per-file.\u003c/li\u003e\r\n\u003cli\u003eDowngraded\r\nmanifest file attacks are difficult to detect since there is no current\r\nway to encoded tamperproof system time into manifest files.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2748326519206818094"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2748326519206818094"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2748326519206818094"}],"author":[{}],"sites$pageName":{"$t":"verified-boot"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/148296311089294589"},"published":{"$t":"2015-03-10T05:43:46.642Z"},"updated":{"$t":"2018-05-14T10:19:10.731Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-14T10:19:08.204Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"External BSP Hosting"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Local-Manifests\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eLocal Manifests\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Manifest-Format\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eManifest Format\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-BSP-Overlays\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBSP Overlays\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Kernel\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eKernel\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Firmware\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eFirmware\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Board-Specific-Packages\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eBoard Specific Packages\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003e\u003cspan\u003eIntroduction\u003c/span\u003e\u003c/h2\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eWhen any BSP developer wants to build their code with Chromium OS and have it easily shared with other developers, they currently typically have to commit their BSPs to either the public or private Chromium OS repositories and update the respective repo manifest files if necessary. In hosting their ebuilds in the Chromium OS repositories, however, they get tied into the \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/developers/tree-sheriffs/sheriff-details-chromium-os/commit-queue-overview\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003eChromium OS Commit Queue\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent\"\u003e and code review process, which is not always ideal for them.  \u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Local-Manifests\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eLocal Manifests\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eIn order to pull in code hosted on an external git repository, developers can make use of local manifest files.  Local manifest files allow more remotes and repositories to be specified for download in additional xml files without direct dependencies being specified in the main Chromium OS manifest files.  Any number of local manifest files may be supplied, allowing developers to name and distribute their local manifest files for each project.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eAfter following the instructions for \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/developer-guide#TOC-Get-the-Source\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003egetting the source\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e, create a “local_manifests” folder inside the .repo folder.  Assuming like in the setup instructions that your source code is in ${HOME}/chromiumos, run the following commands:\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003ecd ${HOME}/chromiumos/.repo\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003emkdir local_manifests\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThen, create or download any additional XML manifest files into the created folder and run `repo sync` to pull down the new code.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Manifest-Format\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eManifest Format\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eLocal manifest files can have any name as long as they are of the .xml extension.  Their format is the same as normal manifest files, and can be viewed \u003c/span\u003e\u003ca href\u003d\"https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e.  A simple example manifest file for pulling \u003c/span\u003e\u003ca href\u003d\"http://github.com/chromiumos/foo.git\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003ehttp://github.com/chromiumos/foo.git\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e on branch “branchname” into src/private-overlays/overlay-foo-private:\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eFile: ${HOME}/chromiumos/.repo/local_manifests/foo.xml\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cdiv /\u003e\u003c/span\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e\u0026lt;?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u0026gt;\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e\u0026lt;manifest\u0026gt;\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e \u003cspan\u003e\u003ccode\u003e    \u003c/code\u003e\u003c/span\u003e\u003ccode\u003e\u0026lt;remote name\u003d\"github\" fetch\u003d\"https://github.com/\" /\u0026gt;\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e \u003cspan\u003e\u003ccode\u003e    \u003c/code\u003e\u003c/span\u003e\u003ccode\u003e\u0026lt;project path\u003d\"src/private-overlays/overlay-foo-private\" name\u003d\"chromiumos/foo\" remote\u003d\"github\" revision\u003d\"branchname\"/\u0026gt;\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e\u0026lt;/manifest\u0026gt;\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-BSP-Overlays\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eBSP Overlays\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThis section is meant as a quick-start guide for the basics of setting up a BSP within an overlay, but doesn't fully cover creating the overlay itself.  The basics of setting up an overlay can be found in the \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003eBoard Porting guide\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e.  Even with board and BSP code hosted in an external repository, the board name still has to be added to the cros-board.eclass file. Also, for brevity, copyright headers have been left out of these sample templates, but should be added in all ebuild files in whatever format is correct for your organization.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003emake.conf\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThis file contains several \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/chromiumos-board-porting-guide#TOC-make.conf:-Global-Build-Settings\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003ekey settings\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e for kernel configurations, such as the architecture, config, and tune.  The key fields are:\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cul\u003e\u003cfont size\u003d\"3\"\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eCHROMEOS_KERNEL_CONFIG - the kernel configuration file to use.  The path is relative to the kernel source checkout.  Setting this overrides any use of CHROMEOS_KERNEL_SPLITCONFIG.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eCHROMEOS_KERNEL_SPLITCONFIG - the kernel splitconfig to use.  Splitconfigs can be used instead of a full config.  For details on splitconfigs, see \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-configuration\" style\u003d\"text-decoration:none;background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003ehere\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eMARCH_TUNE - The common set of compiler flags used to optimize for your processor.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eCFLAGS, CXXFLAGS - The compiler flags to use when building the code.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eUSE - use flags to set.  When using splitconfigs, for example, providing the ‘nowerror’ flag disables treating warnings as errors.\u003c/span\u003e\u003c/li\u003e\u003c/font\u003e\u003c/ul\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eFor an example MIPS board, the make.conf would look something like:\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCHROMEOS_KERNEL_CONFIG\u003d\"arch/mips/configs/ci20_defconfig\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCHROMEOS_KERNEL_ARCH\u003d\"mips\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e# We assume that we are running a little endian 32bit MIPS CPU. If you have\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e# a MIPS64 CPU, then you really should be using the n32 overlay instead.\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eMARCH_TUNE\u003d\"-march\u003dmips32\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCFLAGS\u003d\"${CFLAGS} ${MARCH_TUNE}\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCXXFLAGS\u003d\"${CXXFLAGS} ${MARCH_TUNE}\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e# Kernel doesn't yet build cleanly.\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eUSE\u003d\"${USE} nowerror\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Kernel\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eKernel\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe following files are required for customizing the kernel source, build, or install.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003evirtual/linux-sources/linux-sources-2.ebuild\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"Chrome OS Kernel virtual package\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eHOMEPAGE\u003d\"http://src.chromium.org\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eLICENSE\u003d\"GPL-2\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eSLOT\u003d\"0\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"mips\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eIUSE\u003d\"-kernel_sources\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eRDEPEND\u003d\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e \u003cspan\u003e\u003ccode\u003e    \u003c/code\u003e\u003c/span\u003e\u003ccode\u003esys-kernel/\u0026lt;kernel_name\u0026gt;[kernel_sources\u003d]\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:20.7000007629395px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS value with the correct platform\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the LICENSE value with your license\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace “\u0026lt;kernel_name\u0026gt;” in the RDEPEND field with the name of your kernel package, such as “ci20-kernel”\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003esys-kernel/\u0026lt;kernel_name\u0026gt;/\u0026lt;kernel_name\u0026gt;-\u0026lt;version\u0026gt;.ebuild\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003esys-kernel/\u0026lt;kernel_name\u0026gt;/\u0026lt;kernel_name\u0026gt;-\u0026lt;version\u0026gt;-r1.ebuild\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_REPO\u003d\"\u0026lt;git_repo_path\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_PROJECT\u003d\"\u0026lt;git_repo_name\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_BLACKLIST\u003d\"1\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_COMMIT\u003d\"\u0026lt;git_commit_hash\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e# This must be inherited *after* EGIT/CROS_WORKON variables defined\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003einherit git-2 cros-kernel2 cros-workon\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"Chrome OS Kernel-\u0026lt;kernel_name\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"mips\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDEPEND\u003d\"!sys-kernel/chromeos-kernel-next\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e \u003cspan\u003e\u003ccode\u003e    \u003c/code\u003e\u003c/span\u003e\u003ccode\u003e!sys-kernel/chromeos-kernel\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003e\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eRDEPEND\u003d\"${DEPEND}\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace “\u003c/span\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;kernel_name\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e” with the name of your kernel package, as specified in the RDEPEND field of the linux-sources-2.ebuild file\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS value with the correct platform\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe ‘\u0026lt;kernel_name\u0026gt;-\u0026lt;version\u0026gt;-r1.ebuild’ file is just a symbolic link to the ‘\u0026lt;kernel_name\u0026gt;-\u0026lt;version\u0026gt;.ebuild’ file.  Whenever changes are made to the ebuild file, the symlink should be revbumped/renamed, for instance incrementing ‘-r1’ to ‘-r2’.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;version\u0026gt; should be the version number, for instance “3.0.8”\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_repo_path\u0026gt; is the git repository path, such as “git://github.com/MIPS”\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_repo_name\u0026gt; is the git repository name, such as “CI20_linux”.  This field is prepended with \u0026lt;git_repo_path\u0026gt; when referring to a repository location.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_commit_hash\u0026gt; is the hash of the git commit to use.  For instance, on the CI20_linux repo, “2e5af7d6650ce6435f2894bdd7ee7f0333950942” would refer to the head of the 3.0.8 branch (\u003c/span\u003e\u003ca href\u003d\"https://github.com/MIPS/CI20_linux/tree/ci20-v3.0.8\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003ehttps://github.com/MIPS/CI20_linux/tree/ci20-v3.0.8\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eBy default, this builds the Makefile’s “vmlinuz.bin” target for mips, uImage for arm, and uses the default target for everything else\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eFor customizing the build process, the following functions can be added to the ebuild:\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_prepare() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_prepare/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003ePreparation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e of the source, such as applying patches\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_configure() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_configure/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eConfiguring\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e the source\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_compile() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_compile/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eCompiling\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e the source, i.e. calling make or emake.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_test() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_test/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eRun\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e pre-install test scripts\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_install() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:square;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_install/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003eInstall\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e the package\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Firmware\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eFirmware\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe following files are required for customizing the firmware to install.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003evirtual/chromeos-firmware/chromeos-firmware-2.ebuild\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"Chrome OS Firmware virtual package\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eHOMEPAGE\u003d\"\u003c/code\u003e\u003ca href\u003d\"http://src.chromium.org/\"\u003e\u003ccode\u003ehttp://src.chromium.org\u003c/code\u003e\u003c/a\u003e\u003ccode\u003e\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eLICENSE\u003d\"BSD\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eSLOT\u003d\"0\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"arm\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eIUSE\u003d\"\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eRDEPEND\u003d\"chromeos-base/chromeos-firmware-\u0026lt;name\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:20.7000007629395px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the LICENSE value with your correct license\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS field with your board’s architecture (arm, mips, ppc, x86, etc)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace \u0026lt;name\u0026gt; with the name of your board\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003echromeos-base/chromeos-firmware-\u0026lt;name\u0026gt;/chromeos-firmware-\u0026lt;name\u0026gt;-\u0026lt;version\u0026gt;.ebuild\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003echromeos-base/chromeos-firmware-\u0026lt;name\u0026gt;/chromeos-firmware-\u0026lt;name\u0026gt;-\u0026lt;version\u0026gt;-r1.ebuild\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_REPO\u003d\"\u0026lt;git_repo_path\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_PROJECT\u003d\"\u0026lt;git_repo_name\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_BLACKLIST\u003d\"1\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eCROS_WORKON_COMMIT\u003d\"\u0026lt;git_commit_hash\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003einherit git-2 cros-workon\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"Chrome OS Firmware\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"mips\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:20.7000007629395px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS value with the correct platform\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe ‘chromeos-firmware-\u0026lt;name\u0026gt;-\u0026lt;version\u0026gt;-r1.ebuild’ file is just a symbolic link to the ‘chromeos-firmware-\u0026lt;name\u0026gt;-\u0026lt;version\u0026gt;.ebuild’ file.  Whenever changes are made to the ebuild file, the symlink should be revbumped/renamed, for instance incrementing ‘-r1’ to ‘-r2’.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;version\u0026gt; should be the version number, for instance “2015.03.05” for the revision date for repos that do not have branched versions\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_repo_path\u0026gt; is the git repository path, such as “git://github.com/raspberrypi”\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_repo_name\u0026gt; is the git repository name, such as “firmware”.  This field is prepended with \u0026lt;git_repo_path\u0026gt; when referring to a repository location.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u0026lt;git_commit_hash\u0026gt; is the hash of the git commit to use.  For instance, on the raspberrypi/firmware repo, “cdcb50646bc035e9f3e74b99d764023c4b98d7d5” would refer to the current head of the master branch (https://github.com/raspberrypi/firmware/tree/master)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eBy default, this builds and installs the Makefile’s default target\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eFor customizing the build process, the following functions can be added to the ebuild:\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_prepare() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_prepare/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003ePreparation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e of the source, such as applying patches\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_configure() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_configure/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eConfiguring\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e the source\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_compile() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_compile/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eCompiling\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e the source, i.e. calling make or emake.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_test() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;vertical-align:baseline\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_test/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline\"\u003eRun\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e pre-install test scripts\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.3295454545454544;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003esrc_install() { }\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_install/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003eInstall\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e the package\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Board-Specific-Packages\" /\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eBoard Specific Packages\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe following files are required for adding any specific drivers and tools to a board.\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003evirtual/chromeos-bsp/chromeos-bsp-2.ebuild\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-style:italic;vertical-align:baseline;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"Chrome OS BSP virtual package\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eHOMEPAGE\u003d\"\u003c/code\u003e\u003ca href\u003d\"http://src.chromium.org/\"\u003e\u003ccode\u003ehttp://src.chromium.org\u003c/code\u003e\u003c/a\u003e\u003ccode\u003e\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eLICENSE\u003d\"BSD\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eSLOT\u003d\"0\"\u003c/code\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"arm\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eRDEPEND\u003d\"chromeos-base/chromeos-bsp-\u0026lt;name\u0026gt;\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:20.7000007629395px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the LICENSE value with your correct license\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS field with your board’s architecture (arm, mips, ppc, x86, etc)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace \u0026lt;name\u0026gt; with the name of your board\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-size:15px;white-space:pre-wrap;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003ci\u003echromeos-base/chromeos-bsp-\u0026lt;name\u0026gt;/chromeos-bsp-\u0026lt;name\u0026gt;-0.0.1.ebuild\u003c/i\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;line-height:1.38;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e\u003ci\u003echromeos-base/chromeos-bsp-\u0026lt;name\u0026gt;/chromeos-bsp-\u0026lt;name\u0026gt;-0.0.1-r1.ebuild\u003c/i\u003e\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eEAPI\u003d\"6\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDESCRIPTION\u003d\"\u0026lt;name\u0026gt; bsp (meta package to pull in driver/tool dependencies)\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eLICENSE\u003d\"BSD-Google\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eSLOT\u003d\"0\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eKEYWORDS\u003d\"arm\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eIUSE\u003d\"\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eDEPEND\u003d\"\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003ccode\u003eRDEPEND\u003d\"\"\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cspan\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:20.7000007629395px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cul style\u003d\"font-size:15px;white-space:pre-wrap;font-family:Arial;margin-top:0pt;margin-bottom:0pt;background-color:transparent\"\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the LICENSE value with your correct license\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace the KEYWORDS field with your board’s architecture (arm, mips, ppc, x86, etc)\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eReplace \u0026lt;name\u0026gt; with the name of your board\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eThe ‘chromeos-bsp-\u0026lt;name\u0026gt;-0.0.1-r1.ebuild’ file is just a symbolic link to the ‘chromeos-bsp-\u0026lt;name\u0026gt;-0.0.1.ebuild’ file.  Whenever changes are made to the ebuild file, the symlink should be revbumped/renamed, for instance incrementing ‘-r1’ to ‘-r2’.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eAdding any packages that currently have ebuilds in the source tree should be added to the DEPEND and RDEPEND fields.  The DEPEND field specifies build-time dependencies that will \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;background-color:transparent\"\u003enot\u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e be installed into the build image.  The RDEPEND field specifies run-time dependencies that will be installed into the build image.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;vertical-align:baseline;background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003eOther source can be built and installed by adding \u003c/span\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_prepare/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003esrc_prepare\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e(), \u003c/span\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_configure/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003esrc_configure\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e(), \u003c/span\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_compile/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003esrc_compile\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e(), \u003c/span\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_test/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003esrc_test\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e(), and \u003c/span\u003e\u003ca href\u003d\"https://devmanual.gentoo.org/ebuild-writing/functions/src_install/index.html\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);text-decoration:underline;vertical-align:baseline;background-color:transparent\"\u003esrc_install\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"vertical-align:baseline;background-color:transparent\"\u003e() functions to do the respective work.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/external-bsp-hosting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/148296311089294589"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/148296311089294589"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/148296311089294589"}],"author":[{"name":{"$t":"Steve Fung"},"email":{"$t":"stevefung@chromium.org"}}],"sites$pageName":{"$t":"external-bsp-hosting"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/557500067401980887"},"published":{"$t":"2014-02-02T06:27:13.701Z"},"updated":{"$t":"2018-05-14T10:16:06.306Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-14T10:16:03.213Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Upgrade Ebuild EAPIs HOWTO"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Introduction\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Common-Changes\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eCommon Changes\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-EAPI-Setting\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eEAPI Setting\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Default-Source-Directory-Setting\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eDefault Source Directory Setting\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-New-Function-Phases\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eNew Function Phases\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Implicit-Die-Commands\"\u003e\u003cstrong\u003e2.4 \u003c/strong\u003eImplicit Die Commands\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-The-default-Function\"\u003e\u003cstrong\u003e2.5 \u003c/strong\u003eThe `default` Function\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\r\n\u003cp\u003eGentoo ebuilds have upgraded the API that they have available over time to include new features and fix bugs in existing behavior. In order to guarantee that ebuilds written yesterday continue to work with package managers of tomorrow, the API available to ebuilds has been formalized in the \u003ca href\u003d\"http://wiki.gentoo.org/wiki/Project:PMS\" rel\u003d\"nofollow\"\u003ePackage Manager Spec\u003c/a\u003e (PMS). The short summary is that ebuilds declare the version of the API that they've been written for by setting the EAPI variable at the top of the ebuild, and the spec guarantees that behavioral changes will only occur in newer versions.\u003c/p\u003e\r\n\u003cp\u003eYou might encounter ebuilds using older EAPIs. We'll provide a quick guide to cover the common issues you see when upgrading to the latest version. At this time, that is EAPI 6, but our focus has been on EAPI 5 or newer. This is because the functionality new to EAPI 6 is not significant enough to warrant forcing an upgrade and few ebuilds would even utilize it.\u003c/p\u003e\r\n\u003cp\u003eNote that while the convention thus far has been to use numbers in the official spec (like 0, 1, 2, etc...), the EAPI setting is a string, not an integer.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Common-Changes\" /\u003eCommon Changes\u003c/h2\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-EAPI-Setting\" /\u003eEAPI Setting\u003c/h3\u003e\r\n\u003cp\u003eFirst, if your ebuild doesn't even have an EAPI setting at the top, then it defaults to the oldest version of 0. If it does contain a setting, then you should make sure it is 5.\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# Copyright 2014 The Chromium OS Authors. All rights reserved.\u003cbr /\u003e\r\n# Distributed under the terms of the GNU General Public License v2\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nEAPI\u003d\"4\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cp\u003eThis is what the header of your ebuild should look like. The only thing that comes before the EAPI line is the file's comment block which declares copyright \u0026amp; licensing (the year \u0026amp; license may vary), then a blank line, then the EAPI setting.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Default-Source-Directory-Setting\" /\u003eDefault Source Directory Setting\u003c/h3\u003e\r\n\u003cp\u003eIn EAPI versions before 5, the variable \u003ccode\u003eS\u003c/code\u003e would default to \u003ccode\u003e${WORKDIR}/${P}\u003c/code\u003e. But if \u003ccode\u003e${P}\u003c/code\u003e did not exist, the ebuild would silently fall back to the work directory (\u003ccode\u003e${WORKDIR}\u003c/code\u003e). For some ebuilds, this wasn't a problem because they only installed files out of \u003ccode\u003e${FILESDIR}\u003c/code\u003e or \u003ccode\u003e${SYSROOT}\u003c/code\u003e. \u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eStarting with EAPI 5, the PM longer does this automatic fallback to \u003ccode\u003e${WORKDIR}\u003c/code\u003e. If you get errors like \"\u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003eThe source directory '...' doesn't exist\u003c/code\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e\", then you're hitting this problem (i.e. relying on the older silent fallback behavior).\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003eThe easy answer is usually to set \u003ccode\u003eS\u003c/code\u003e to \u003ccode\u003e${WORKDIR}\u003c/code\u003e.This might not be the right answer (maybe your source lives somewhere else), but frequently this is OK. So after the \u003ccode\u003eDEPEND\u003c/code\u003e/\u003ccode\u003eRDEPEND\u003c/code\u003e variables and before any of the src_* or pkg_* functions, add:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003eS\u003d${WORKDIR}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-New-Function-Phases\" /\u003eNew Function Phases\u003c/h3\u003e\r\n\u003cp\u003eIn EAPI versions starting with 2, some source functions were split up to better reflect the overall build process. So if you're upgrading from those, here's what you need to know:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eIf you declare a src_unpack function, move all source patching/hacking (like running `sed`) to a new src_prepare. This often means that src_unpack is deleted entirely as the default of unpacking all archives in SRC_URI is sufficient.\u003c/li\u003e\r\n\u003cli\u003eIf you declare a src_compile function, move all configure steps (like `econf` or `./configure`) to a new src_configure. This often means that src_compile is deleted entirely as the default of just running `emake` is sufficient.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eHere is an example of splitting src_unpack into src_unpack and src_prepare:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# This is the old (pre-EAPI 4) version.\u003cbr /\u003e\r\nsrc_unpack() {\u003cbr /\u003e\r\n    unpack ${A}\u003cbr /\u003e\r\n    cd \"${S}\"\u003cbr /\u003e\r\n    epatch \"${FILESDIR}\"/${P}-a-fix.patch\u003cbr /\u003e\r\n    sed -i 's:old:new:' configure.ac || die\u003cbr /\u003e\r\n    eautoreconf\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# This is the new (EAPI 4 \u0026amp; 5) version.\u003cbr /\u003e\r\n# Note that there is no src_unpack at all because the default is `unpack ${A}`.\u003cbr /\u003e\r\n# If you needed to unpack things in a specific way, you can add your own\u003cbr /\u003e\r\n# src_unpack function and do just that.\u003cbr /\u003e\r\nsrc_prepare() {\u003cbr /\u003e\r\n    epatch \"${FILESDIR}\"/${P}-a-fix.patch\u003cbr /\u003e\r\n    sed -i 's:old:new:' configure.ac || die\u003cbr /\u003e\r\n    eautoreconf\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# This is the new (EAPI 6+) version.\u003cbr /\u003e\r\n# Note that there is no src_unpack at all because the default is `unpack ${A}`.\u003cbr /\u003e\r\n# If you needed to unpack things in a specific way, you can add your own\u003cbr /\u003e\r\n# src_unpack function and do just that.\u003cbr /\u003e\r\nsrc_prepare() {\u003cbr /\u003e\r\n    default\u003cbr /\u003e\r\n    eapply \"${FILESDIR}\"/${P}-a-fix.patch\u003cbr /\u003e\r\n    sed -i 's:old:new:' configure.ac || die\u003cbr /\u003e\r\n    eautoreconf\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eHere is an example of splitting src_compile into src_configure and src_compile:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# This is the old (pre-EAPI 4) version.\u003cbr /\u003e\r\nsrc_compile() {\u003cbr /\u003e\r\n    econf \\\u003cbr /\u003e\r\n        --enable-foo \\\u003cbr /\u003e\r\n        $(use_enable bluetooth) \\\u003cbr /\u003e\r\n        || die\u003cbr /\u003e\r\n    emake || die\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# This is the new (EAPI 4+) version.\u003cbr /\u003e\r\n# Note that there is no src_compile at all because the default is `emake`.\u003cbr /\u003e\r\n# If you passed additional flags to `emake`, then you can add your own\u003cbr /\u003e\r\n# src_compile function and do just that.\u003cbr /\u003e\r\nsrc_configure() {\u003cbr /\u003e\r\n    econf \\\u003cbr /\u003e\r\n        --enable-foo \\\u003cbr /\u003e\r\n        $(use_enable bluetooth)\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Implicit-Die-Commands\" /\u003eImplicit Die Commands\u003c/h3\u003e\r\n\u003cp\u003eStarting with EAPI 4, all of the helper commands (like emake and doins and dobin and ...) were updated to automatically call `die` when they failed. This means you no longer have to (and in fact you should avoid doing so). This does not apply to other commands like `mv` or `sed` or `cp` -- if you run those, you should still call `die`.\u003c/p\u003e\r\n\u003cp\u003eHere's an example of converting to these newer EAPIs:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e# This is the old (pre-EAPI 4) version.\u003cbr /\u003e\r\nsrc_compile() {\u003cbr /\u003e\r\n    emake USE_EXTRA\u003d1 || die \"emake failed\"\u003cbr /\u003e\r\n}\u003cbr /\u003e\r\nsrc_install() {\u003cbr /\u003e\r\n    emake install install-man USE_EXTRA\u003d1 DESTDIR\u003d\"${D}\" || die \"emake install failed\"\u003cbr /\u003e\r\n    dodoc *.txt || die \"dodoc failed\"\u003cbr /\u003e\r\n    insinto /etc/init\u003cbr /\u003e\r\n    newins \"${FILESDIR}\"/package.init package || die \"doins failed\"\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# This is the new (EAPI 4+) version.\u003cbr /\u003e\r\nsrc_compile() {\u003cbr /\u003e\r\n    emake USE_EXTRA\u003d1\u003cbr /\u003e\r\n}\u003cbr /\u003e\r\nsrc_install() {\u003cbr /\u003e\r\n    emake install install-man USE_EXTRA\u003d1 DESTDIR\u003d\"${D}\"\u003cbr /\u003e\r\n    dodoc *.txt\u003cbr /\u003e\r\n    insinto /etc/init\u003cbr /\u003e\r\n    newins \"${FILESDIR}\"/package.init package\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003cp\u003eOn the rare occasion you expect a command to fail and want to handle it yourself, you can use the new `nonfatal` helper like so:\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003esrc_install() {\u003cbr /\u003e\r\n    if ! nonfatal doins some.bin; then\u003cbr /\u003e\r\n        # Handle the failed install yourself.\u003cbr /\u003e\r\n    fi\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-default-Function\" /\u003eThe `default` Function\u003c/h3\u003e\r\n\u003cp\u003eThere is now a nifty helper function called \u003ccode\u003edefault\u003c/code\u003e that let's you execute the default commands that a function would do. This saves a bit of code while letting you still do a bit of additional things. It most commonly comes up in the \u003ccode\u003esrc_install\u003c/code\u003e function when packages use `\u003ccode\u003eemake install DESTDIR\u003d\"${D}\"\u003c/code\u003e`. If you need to pass additional flags to \u003ccode\u003eemake\u003c/code\u003e though, then this won't help.\u003c/p\u003e\r\n\u003cp\u003eStarting with EAPI 6, the \u003ccode\u003esrc_prepare\u003c/code\u003e function must always call \u003ccode\u003edefault\u003c/code\u003e. If you forget, the build will usually fail for you automatically :).\u003c/p\u003e\r\n\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003ccode\u003e# This is the old (pre-EAPI 4) version.\u003cbr /\u003e\r\nsrc_install() {\u003cbr /\u003e\r\n    emake install DESTDIR\u003d\"${D}\" || die\u003cbr /\u003e\r\n    doman man/*.1 || die\u003cbr /\u003e\r\n    insinto /etc\u003cbr /\u003e\r\n    doins \"${FILESDIR}\"/some.conf || die\u003cbr /\u003e\r\n}\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e# This is the new (EAPI 4+) version.\u003cbr /\u003e\r\nsrc_install() {\u003cbr /\u003e\r\n    default\u003cbr /\u003e\r\n    doman man/*.1\u003cbr /\u003e\r\n    insinto /etc\u003cbr /\u003e\r\n    doins \"${FILESDIR}\"/some.conf\u003cbr /\u003e\r\n\u003c/code\u003e}\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/upgrade-ebuild-eapis"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/557500067401980887"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/557500067401980887"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/557500067401980887"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$pageName":{"$t":"upgrade-ebuild-eapis"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1415414330204837380"},"published":{"$t":"2018-05-13T05:13:38.165Z"},"updated":{"$t":"2018-05-13T05:16:42.177Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-13T05:16:39.818Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Administrative Log Messages"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eWhen Chrome encounters events that may be important to system administrators, it adds entries to a system log file that administrators can access and monitor.  For example, these may include informational messages about enterprise policies or warnings about security events.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eThese events are logged to the Windows Event Log on Windows, or to the messages log file on POSIX systems.  In Chrome's code, the SYSLOG macro is used to generate the logs, and the code around the uses of the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/base/syslog_logging.h\"\u003eSYSLOG macro\u003c/a\u003e can often give some context to the meaning of the message.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eMore information about Chrome's debug logs can be found \u003ca href\u003d\"https://support.google.com/chrome/a/answer/6271282?hl\u003den\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Site-Isolation-SYSLOGs\" /\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eSite Isolation SYSLOGs\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eOne category of administrative log messages has been added in Chrome 68 to track violations of \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation\"\u003eSite Isolation\u003c/a\u003e security restrictions.  These messages may indicate that a renderer process has been compromised and is trying to access cross-site data that would otherwise be off-limits, such as cookies, passwords, or localStorage.  The messages occur when Chrome has decided to kill a misbehaving renderer process in one of these situations.  (Keep in mind that there may be some false positives in the log if a bug in Chrome causes a renderer process to send the wrong IPCs.)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eThe current log messages include:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eCookies:\u003c/li\u003e\u003cul\u003e\u003cli\u003eKilling renderer: illegal cookie write. Reason: N\u003c/li\u003e\u003cli\u003eKilling renderer: illegal cookie read. Reason: N\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ePasswords:\u003c/li\u003e\u003cul\u003e\u003cli\u003eKilling renderer: illegal password access from about: or data: URL. Reason: N\u003c/li\u003e\u003cli\u003eKilling renderer: illegal password access. Reason: N\u003c/li\u003e\u003c/ul\u003e\u003cli\u003elocalStorage:\u003c/li\u003e\u003cul\u003e\u003cli\u003eKilling renderer: illegal localStorage request.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eMost of these messages include a reason code, which corresponds to an enum value in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/content/browser/bad_message.h\"\u003econtent/browser/bad_message.h\u003c/a\u003e (or, in the case of passwords, in \u003ca href\u003d\"https://cs.chromium.org/chromium/src/components/password_manager/content/browser/bad_message.h\"\u003ecomponents/password_manager/content/browser/bad_message.h\u003c/a\u003e).  These enum values can point administrators to the relevant part of Chrome's code to understand more about what happened during the event.\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/log-messages"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1415414330204837380"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1415414330204837380"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1415414330204837380"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"log-messages"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"USl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8710920808157564312"},"published":{"$t":"2010-06-24T20:11:45.464Z"},"updated":{"$t":"2018-05-08T03:12:57.794Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-08T03:12:55.350Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Frequently Asked Questions"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cb\u003e\u003cdiv\u003e\u003cb\u003eWhat is Google Chrome?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003c/b\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cb\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eGoogle Chrome is a new, fast web browser from Google.\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/blockquote\u003e\u003cb\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003eWhy should we use Google Chrome?  What would it give my organization?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/b\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cb\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eGoogle Chrome offers a number of benefits, including security, speed, stability, and simplicity.  Find out about all the features of Google Chrome \u003ca href\u003d\"http://google.com/chrome\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/blockquote\u003e\u003cb\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003eWhat is Google Chrome for Enterprise?  Is it a different build than the Google Chrome I install from google.com?\u003c/b\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eGoogle Chrome for Enterprise is just Google Chrome.  Every Google Chrome has the same features, so it's equivalent to the Google Chrome you can download from google.com.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003eWhat enterprise features does Chrome offer?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eSupport for (group) policy and centralized configuration \u003cspan style\u003d\"font-size:10pt\"\u003e(list of supported policies \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3\" style\u003d\"font-size:10pt\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e)\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e, a specialized MSI installer, and control over auto-update frequency.\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003eDoes Google Chrome support enterprise features on all platforms?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003eHow do I install Google Chrome?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYou can download Google Chrome from \u003ca href\u003d\"http://www.google.com/chrome\"\u003ehttp://www.google.com/chrome\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003eDo you have an offline installer or an MSI?\u003c/b\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes.  You can download the latest MSI \u003ca href\u003d\"https://enterprise.google.com/chrome/chrome-browser/\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eCan I roll back Google Chrome to a previous version?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eNo - rollback is not supported.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTo get to a previous version (which would not be supported by Google), you would need to uninstall your current version, delete every user's saved profile data, and re-install the older version.  Users' personal profile data is kept in:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOn Windows XP: C:\\Documents and Settings\\\u0026lt;user\u0026gt;\\Local Settings\\Application Data\\Google\\Chrome\\User Data \u003c/div\u003e\u003cdiv\u003eOn Windows Vista / 7: C:\\Users\\\u0026lt;user\u0026gt;\\AppData\\Local\\Google\\Chrome\\User Data\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis means users will lose their bookmarks, history, etc., so use this method with extreme caution.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eAre there older versions of the MSI available?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eNo, we do not currently make older versions of the MSI available, as they are no longer supported.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow can I install per-system instead of per-user?\u003c/b\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eThe MSI will only install at system-level, which means all users on the machine will have access to the same instance / version of Google Chrome.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDoes Google Chrome install over itself?  What if users already have it installed?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eGoogle Chrome does not install over itself.  It first checks if it is already installed at the same elevation level.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHowever, if Google Chrome is already installed by the user at user-level, installing it system-level will remove the user-level installs and replace them with a system-level install.  User/profile data would remain.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow do I control Google Chrome's settings?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYou can control and lock down user preferences through \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/windows-quick-start\"\u003eGroup Policy settings\u003c/a\u003e on Windows, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/mac-quick-start\"\u003eMCX configuration on Mac\u003c/a\u003e, and \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/linux-quick-start\"\u003eJSON files in special directories on Linux\u003c/a\u003e.  For Windows, it is recommended to use Group Policy vs. preferences files because only Group Policy can be enforced.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003eWhat settings does Google Chrome allow an administrator to configure?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eA list of supported policies is \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-list-3\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDoes Google Chrome allow me to set mandatory preferences and recommended preferences through policy?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes.  On Windows, you can set policies in HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER, respectively.  On Linux, set the policy files under /etc/opt/chrome/policies/managed and /etc/opt/chrome/policies/recommended, respectively.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDo you have group policy templates, or an example of a policy file?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes.  You can find group policy templates \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-templates\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cb\u003eWhere can I get a policy template for Google Chrome for Mac?\u003c/b\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eThe template is bundled into the application package itself.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhat if I need to pre-configure a setting that is not a supported policy?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYou can put some preferences into a file called \"master_preferences\" next to the Google Chrome executable, and those will be interpreted as part of the user's preferences.  You can find out more about this technique \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/configuring-other-preferences\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhat if users have already installed Chrome themselves?  Will those Chromes respect policies I set?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003eYes.\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow do I pre-install extensions?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eInformation on pre-installing extensions is \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/pre-installed-extensions\"\u003ehere\u003c/a\u003e. \u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003cb\u003eHow do I turn off auto-updates?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eAlthough it is not recommended, you can find out how to turn off auto-updates \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/turning-off-auto-updates\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003ehere\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow often does Google Chrome update?  How many versions per year should one expect?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eGoogle Chrome's stable channel updates often.  You can see how many major and minor updates there were to the stable channel on \u003ca href\u003d\"http://googlechromereleases.blogspot.com\" rel\u003d\"nofollow\"\u003ehttp://googlechromereleases.blogspot.com\u003c/a\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhere do I go to find out about Google Chrome updates?  How do I know a new update is coming?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eFollow the updates on \u003ca href\u003d\"http://googlechromereleases.blogspot.com\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003ehttp://googlechromereleases.blogspot.com\u003c/a\u003e.  We suggest adding this as one of your regular RSS feeds.  We post here every time there is a new release of any channel.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDoes Google Chrome auto-update, even if the users on a machine do not have administrative rights?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhere can I find release notes for each version?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ca href\u003d\"http://googlechromereleases.blogspot.com\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003ehttp://googlechromereleases.blogspot.com\u003c/a\u003e\u003c/span\u003e\u003c/b\u003e has high-level release notes and lists security fixes for each release.  We suggest you follow this blog.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow can I get early warning and information about security updates?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eSubscribing to the blog at \u003ca href\u003d\"http://googlechromereleases.blogspot.com\" rel\u003d\"nofollow\"\u003ehttp://googlechromereleases.blogspot.com\u003c/a\u003e will give you information about security updates as soon as they are public; this is the right list to watch.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow many versions back do you support?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eWe \u003cb\u003eonly\u003c/b\u003e support the most current stable channel release.  Older releases are not supported.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow do I know what the most current version of Google Chrome is for Windows?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eWe've created a utility at \u003ca href\u003d\"https://omahaproxy.appspot.com/win\"\u003ehttps://omahaproxy.appspot.com/win\u003c/a\u003e to list the current stable version on Windows.\u003c/div\u003e\u003c/blockquote\u003e\u003cb\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003eHow do I know what the most current version of Google Chrome is for other platforms?\u003c/b\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eAs above, \u003ca href\u003d\"https://omahaproxy.appspot.com/viewer\"\u003ehttps://omahaproxy.appspot.com/viewer\u003c/a\u003e provides a list of current revisions.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eCan I get phone or email support?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eYes, if you are a Google Apps for Business customer.  Call the same number, use the same email address, or file a ticket via your control panel the same way you do for any Google Apps issues.  Click \u003ca href\u003d\"http://support.google.com/enterprisehelp/bin/answer.py?hl\u003den\u0026amp;answer\u003d138863\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e for information on how to access the Google Enterprise Support Portal.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhat other support resources are available?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eGoogle Chrome has a full \u003ca href\u003d\"http://www.google.com/support/chrome/?hl\u003den-US\"\u003ehelp center\u003c/a\u003e, along with a \u003ca href\u003d\"http://www.google.com/support/forum/p/Chrome?hl\u003den\u0026amp;utm_source\u003dHC\u0026amp;utm_medium\u003dleftnav\u0026amp;utm_campaign\u003dchrome\"\u003ehelp forum\u003c/a\u003e, and \u003ca href\u003d\"http://code.google.com/p/chromium/issues/list\"\u003epublic bug tracker\u003c/a\u003e.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eI found a bug in Chrome that I need fixed.  Who should I contact and when can I expect it fixed?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry\" style\u003d\"color:rgb(71,18,100);outline-style:none;outline-width:initial;outline-color:initial\"\u003ePlease file a bug\u003c/a\u003e in our public issue tracker.  You may want to search for any other similar bugs to make sure the issue isn't already being resolved.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eUnfortunately, we cannot give exact timing on when specific issues will be fixed.  You can follow the public bug to see when changes are made, when it is marked as fixed and closed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have support from Google via Google Apps subscription, please contact Google as you would for a Google Apps issue.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eGoogle Chrome doesn't work with some of our internal applications.  Will you fix this?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eMost of these issues are not actually bugs in Google Chrome -- the applications themselves were written for a specific web browser, and do not handle other browsers properly.  You may want to contact whoever administrates those applications and ask about browser compatibility, as Google Chrome cannot fix those issues.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOf course, if you do find issues that are true bugs in Google Chrome (pages crash, it shows web pages differently than Safari, etc.), then \u003ca href\u003d\"http://code.google.com/p/chromium/issues/entry\"\u003eplease let us know\u003c/a\u003e by filing a bug.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWe want to deploy Google Chrome, but we have legacy applications that don't work in it.  What can we do?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eThere are a couple of options in this scenario:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e1.  Update the legacy application to work on modern browsers (if possible)\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e2.  Use Chrome's \u003ca href\u003d\"https://support.google.com/chrome/a/answer/3019558?hl\u003den\"\u003elegacy browser support\u003c/a\u003e to enable loading legacy applications in a legacy browser.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/frequently-asked-questions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8710920808157564312"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8710920808157564312"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8710920808157564312"}],"author":[{}],"sites$pageName":{"$t":"frequently-asked-questions"},"sites$revision":{"$t":"28"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1013386434415574096"},"published":{"$t":"2018-05-04T11:44:03.313Z"},"updated":{"$t":"2018-05-04T11:49:24.490Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-05-04T11:49:22.725Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GLitch vulnerability status"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Vulnerability-description\" /\u003e\u003cspan\u003eVulnerability description\u003c/span\u003e\u003c/h2\u003e\u003cspan\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003ca href\u003d\"https://www.vusec.net/wp-content/uploads/2018/05/glitch.pdf\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGLitch vulnerability\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e uses timing information gathered from the GPU to execute a \u003c/span\u003e\u003ca href\u003d\"https://en.wikipedia.org/wiki/Row_hammer\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRowhammer-style\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e bit-flip attack. High-precision GPU timers can be used from an untrusted web page via WebGL to determine the physical layout of memory pages. GL shaders running on the GPU are then used to cause bit flips in CPU-accessible DRAM on unified memory architecture GPUs.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSuccessful exploitation would enable an attacker to escalate privileges from Javascript. This has been demonstrated to allow arbitrary code execution within the Chrome sandbox.\u003c/span\u003e\u003c/p\u003e\u003c/font\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Chrome-OS-response\" /\u003e\u003cspan\u003eChrome OS response\u003c/span\u003e\u003c/h2\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome OS 65, released to the stable channel on \u003c/span\u003e\u003ca href\u003d\"https://chromereleases.googleblog.com/2018/04/stable-channel-update-for-chrome-os.html\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eApril 5, 2018\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, mitigates the remote vector of the GLitch vulnerability on all Chrome OS devices by removing access to high-precision WebGL timers. Users can \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/site-isolation\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eenable Site Isolation\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for further protection.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Affected-devices\" /\u003e\u003cspan\u003eAffected devices\u003c/span\u003e\u003c/h2\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eChrome OS Intel devices are protected against GLitch and other Rowhammer-style bit flips by either using double refresh; or TRR on DDR4 RAM, if supported. Chrome OS ARM devices use DDR3 RAM, which is theoretically vulnerable to Rowhammer-style attacks; however, bit flips have not been reproduced on these devices. No further action is necessary for Chrome OS ARM devices at the moment.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/glitch-vulnerability-status"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1013386434415574096"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1013386434415574096"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1013386434415574096"}],"author":[{"name":{"$t":"Jorge Lucangeli Obes"},"email":{"$t":"jorgelo@chromium.org"}}],"sites$pageName":{"$t":"glitch-vulnerability-status"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1777508855143585280"},"published":{"$t":"2018-04-17T16:42:02.781Z"},"updated":{"$t":"2018-04-17T16:45:43.395Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-17T16:45:41.787Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Extension Support for App WebViews"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-It-s-sometimes-useful-to-allow-an-extension-to-interact-with-WebView-content.-For-example-applications-running-in-Chrome-OS-Kiosk-mode-may-want-to-allow-users-to-use-accessibility-extensions.-This-doc-offers-a-brief-walkthrough-for-how-extensions-can-use-e\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\" style\u003d\"font-weight:normal\"\u003eIt's sometimes useful to allow an extension to interact with WebView content. For example, applications running in Chrome OS Kiosk mode may want to allow users to use accessibility extensions. \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-weight:400\"\u003eThis doc offers a brief walkthrough for how extensions can use existing WebView and App framework support to interact with WebView content.  It describes the basic mechanisms that are available and proposes a simple architecture an app could employ to connect one or more extensions to its WebViews’ guests.\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e\u003ca href\u003d\"https://docs.google.com/document/d/1fVLHKh8lmN3rQDyueabReNB11DU0kGmx8UVyeZvmmHc/edit#\"\u003ehttps://docs.google.com/document/d/1fVLHKh8lmN3rQDyueabReNB11DU0kGmx8UVyeZvmmHc/edit#\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/extension-support-for-app-webviews"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1777508855143585280"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4061537406890692522/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1777508855143585280"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1777508855143585280"}],"author":[{"name":{"$t":"Albert Bodenhamer"},"email":{"$t":"abodenha@chromium.org"}}],"sites$pageName":{"$t":"extension-support-for-app-webviews"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},"published":{"$t":"2009-11-19T17:03:55.368Z"},"updated":{"$t":"2018-04-17T16:27:16.568Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-08T22:06:32.757Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How Tos and Troubleshooting"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cp\u003e\r\nThe pages in this section have practical instructions to help you use and modify a Chromium-based OS. Also see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\"\u003eChromium OS Developer Guide\u003c/a\u003e.\u003cbr /\u003e\u003c/p\u003e\u003cimg src\u003d\"http://www.google.com/chart?chc\u003dsites\u0026amp;cht\u003dd\u0026amp;chdp\u003dsites\u0026amp;chl\u003d%5B%5BPage+listing'%3D20'f%5Cv'a%5C%3D0'10'%3D499'0'dim'%5Cbox1'b%5CF6F6F6'fC%5CF6F6F6'eC%5C0'sk'%5C%5B'%5D'a%5CV%5C%3D12'f%5C%5DV%5Cta%5C%3D10'%3D0'%3D500'%3D297'dim'%5C%3D10'%3D10'%3D500'%3D297'vdim'%5Cbox1'b%5Cva%5CF6F6F6'fC%5CC8C8C8'eC%5C'a%5C%5Do%5CLauto'f%5C\u0026amp;sig\u003dx5z8H4DplZUYp7X4J5EY798sKFM\" data-type\u003d\"subpages\" data-props\u003d\"align:left;displayAs:TOC;maxDepth:6;rootPage:THIS_PAGE;wrap:false;\" width\u003d\"500\" height\u003d\"300\" style\u003d\"display:block;text-align:left;margin-right:auto;\" /\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8281191106998714061"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8281191106998714061"}],"author":[{}],"sites$pageName":{"$t":"how-tos-and-troubleshooting"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"Wil7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1396096524643049009"},"published":{"$t":"2018-01-02T23:35:26.720Z"},"updated":{"$t":"2018-04-13T18:02:05.077Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-13T18:02:01.237Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Meltdown/Spectre vulnerability status for Chrome OS devices"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUpdate 04/13/2018: this page has been moved to \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003ca href\u003d\"https://www.chromium.org/chromium-os/meltdown-spectre-vulnerability-status\"\u003ehttps://www.chromium.org/chromium-os/meltdown-spectre-vulnerability-status\u003c/a\u003e.\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chrome-os-devices-and-kernel-versions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1396096524643049009"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1396096524643049009"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1396096524643049009"}],"author":[{"name":{"$t":"Jorge Lucangeli Obes"},"email":{"$t":"jorgelo@chromium.org"}}],"sites$pageName":{"$t":"chrome-os-devices-and-kernel-versions"},"sites$revision":{"$t":"33"}},{"gd$etag":"\"KXsmYD5fFA..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/69870702503784156"},"published":{"$t":"2013-08-07T03:38:37.878Z"},"updated":{"$t":"2018-04-12T23:15:47.487Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-12T23:15:46.020Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Blink IDL Extended Attributes"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-size:10pt;font-weight:normal\"\u003e\r\n\u003cdiv /\u003e\u003c/span\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\r\n\u003c/div\u003e\u003cdiv\u003eDocumentation moved into the source tree:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/IDLExtendedAttributes.md\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/224672608071467632"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/blink/webidl/blink-idl-extended-attributes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/69870702503784156"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/69870702503784156"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/69870702503784156"}],"author":[{"name":{"$t":"Nils Barth"},"email":{"$t":"nbarth@chromium.org"}}],"sites$pageName":{"$t":"blink-idl-extended-attributes"},"sites$revision":{"$t":"262"}},{"gd$etag":"\"KXsmYD1bFg..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},"published":{"$t":"2013-03-22T20:24:44.232Z"},"updated":{"$t":"2018-04-12T21:02:07.895Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-12T21:02:05.946Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Security Sheriff"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"text-align:center\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003eThe \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/security/sheriff.md\"\u003ecanonical version of this document is now in the Chromium source tree\u003c/a\u003e.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:10pt\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:13.3333px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3052022592259397387"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$pageName":{"$t":"security-sheriff"},"sites$revision":{"$t":"120"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4092538734283380888"},"published":{"$t":"2009-12-02T23:59:23.935Z"},"updated":{"$t":"2018-04-05T17:56:56.607Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-05T17:56:52.993Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Audio / Video Playback"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2 style\u003d\"text-align:center\"\u003e\u003ca name\u003d\"TOC-Interested-in-helping-out-Check-out-our-bugs-New-to-Chromium-GoodFirstBug-is-your-friend-\" /\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003eInterested in helping out?  Check out our \u003c/span\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?q\u003dcomponent%3AInternals%3EMedia\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003ebugs\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e!  New to Chromium?  \u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e\u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dcomponent%3AInternals%3EMedia+Hotlist%3DGoodFirstBug\"\u003eGoodFirstBug\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e is your friend!\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003eFiling a new bug: \u003ca href\u003d\"https://bugs.chromium.org/p/chromium/issues/entry?template\u003dAudio/Video%20Issue\" target\u003d\"_blank\"\u003eTemplate\u003c/a\u003e \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eDocumentation:\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  - \u003ca href\u003d\"https://html.spec.whatwg.org/#htmlaudioelement\" rel\u003d\"nofollow\"\u003eHTMLAudioElement\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  - \u003ca href\u003d\"https://html.spec.whatwg.org/#htmlmediaelement\" rel\u003d\"nofollow\"\u003eHTMLMediaElement\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  - \u003ca href\u003d\"https://html.spec.whatwg.org/#htmlvideoelement\" rel\u003d\"nofollow\"\u003eHTMLVideoElement\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMuch of the documentation below is out of date and has significant gaps. For the most up to date documentation please see the \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/media/README.md\"\u003eREADME.md\u003c/a\u003e file in the media/ directory (which is where all the code for Chromium's media pipeline lives).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\r\n\u003cdiv\u003eThere are several major components to Chromium's media playback implementation, here are three most folks are commonly interested in:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/pipeline.h\"\u003ePipeline\u003c/a\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eChromium's implementation of a media playback engine\u003c/li\u003e\r\n\u003cli\u003eHandles audio/video synchronization and resource fetching\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eFFmpeg{\u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/filters/ffmpeg_demuxer.h\"\u003eDemuxer\u003c/a\u003e, \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/filters/ffmpeg_audio_decoder.h\"\u003eAudioDecoder\u003c/a\u003e, \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/filters/ffmpeg_video_decoder.h\"\u003eVideoDecoder\u003c/a\u003e}\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eOpen source library used for container parsing and software audio and video decoding.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eBlink's \u003ca href\u003d\"https://cs.chromium.org/chromium/src/third_party/WebKit/Source/core/html/media/HTMLMediaElement.h\"\u003eHTMLMediaElement\u003c/a\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eImplements the HTML and Javascript bindings as specified by WHATWG\u003c/li\u003e\r\n\u003cli\u003eHandles rendering the user agent controls\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Pipeline\" /\u003ePipeline\u003c/h4\u003e\r\n\u003cdiv\u003eThe pipeline is a pull-based media playback engine that abstracts each step of media playback into (at least) 6 different filters: data source, demuxing, audio decoding, video decoding, audio rendering, and video rendering.  The pipeline manages the lifetime of the renderer and exposes a thread safe interface to clients. The filters are connected together to form a filter graph.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eDesign goals:\u003c/div\u003e\r\n\u003cdiv\u003e  - Use Chromium threading constructs such as \u003ca href\u003d\"https://cs.chromium.org/chromium/src/base/task_runner.h\"\u003eTaskRunner\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  - Filters do not determine threading model\u003c/div\u003e\r\n\u003cdiv\u003e  - All filter actions are asynchronous and use callbacks to signal completion\u003c/div\u003e\r\n\u003cdiv\u003e  - Upstream filters are oblivious to downstream filters (i.e., DataSource is unaware of Demuxer)\u003c/div\u003e\r\n\u003cdiv\u003e  - Prefer explicit types and methods over general types and methods (i.e., prefer \u003cfont face\u003d\"'courier new', monospace\"\u003efoo-\u0026gt;Bar()\u003c/font\u003e over \u003cfont face\u003d\"'courier new', monospace\"\u003efoo-\u0026gt;SendMessage(MSG_BAR)\u003c/font\u003e)\u003c/div\u003e\r\n\u003cdiv\u003e  - Can run inside security sandbox\u003c/div\u003e\r\n\u003cdiv\u003e  - Runs on Windows, Mac and Linux on x86 and ARM\u003c/div\u003e\r\n\u003cdiv\u003e  - Supports arbitrary audio/video codecs\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eDesign non-goals:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e  - Dynamic loading of filters via shared libraries\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  - Buffer management negotiation\u003c/div\u003e\r\n\u003cdiv\u003e  - Building arbitrary filter graphs\u003c/div\u003e\r\n\u003cdiv\u003e  - Supporting filters beyond the scope of media playback\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe original research into supporting video in Chromium started in September 2008.  Before deciding to implement our own media playback engine we considered the following alternative technologies:\u003c/div\u003e\r\n\u003cdiv\u003e  - DirectShow (Windows specific, cannot run inside sandbox without major hacking)\u003c/div\u003e\r\n\u003cdiv\u003e  - GStreamer (Windows support questionable at the time, extra ~2MB of DLLs due to library dependencies, targets many of our non-goals)\u003c/div\u003e\r\n\u003cdiv\u003e  - VLC (cannot use due to GPL)\u003c/div\u003e\r\n\u003cdiv\u003e  - MPlayer (cannot use due to GPL)\u003c/div\u003e\r\n\u003cdiv\u003e  - OpenMAX (complete overkill for our purposes)\u003c/div\u003e\r\n\u003cdiv\u003e  - liboggplay (specific to Ogg Theora/Vorbis)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eOur approach was to write our own media playback engine that was audio/video codec agnostic and focused on playback.  Using FFmpeg avoids both the use of proprietary/commercial codecs and allows Chromium's media engine to support a wide variety of formats depending on FFmpeg's build configuration.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/video/video_stack_arch.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1259798424559/developers/design-documents/video/video_stack_arch.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAs previously mentioned, the pipeline is completely pull-based and relies on the sound card to drive playback.  As the sound card requests additional data, the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/audio_renderer.h\"\u003eaudio renderer\u003c/a\u003e requests decoded audio data from the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/audio_decoder.h\"\u003eaudio decoder\u003c/a\u003e, which requests encoded buffers from the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/demuxer.h\"\u003edemuxer\u003c/a\u003e, which reads from the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/data_source.h\"\u003edata source\u003c/a\u003e, and so on. As decoded audio data data is fed into the sound card the pipeline's global clock is updated.  The \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/video_renderer.h\"\u003evideo renderer\u003c/a\u003e polls the global clock upon each vsync to determine when to request decoded frames from the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/video_decoder.h\"\u003evideo decoder\u003c/a\u003e and when to render new frames to the video display. In the absence of a sound card or an audio track, the system clock is used to drive video decoding and rendering. Relevant source code is in the \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/\"\u003emedia\u003c/a\u003e directory.\u003c/div\u003e\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe pipeline uses a state machine to handle playback and events such as pausing, seeking, and stopping.  A state transition typically consists of notifying all filters of the event and waiting for completion callbacks before completing the transition (diagram from \u003ca href\u003d\"https://cs.chromium.org/chromium/src/media/base/pipeline_impl.h\"\u003epipeline_impl.h\u003c/a\u003e):\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Times;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"word-wrap:break-word;white-space:pre-wrap\"\u003e// [ *Created ] [ Any State ]\r\n// | Start() | Stop()\r\n// V V\r\n// [ Starting ] [ Stopping ]\r\n// | |\r\n// V V\r\n// [ Playing ] \u0026lt;---------. [ Stopped ]\r\n// | | Seek() |\r\n// | V |\r\n// | [ Seeking ] ----'\r\n// | ^\r\n// | Suspend() |\r\n// V |\r\n// [ Suspending ] |\r\n// | |\r\n// V |\r\n// [ Suspended ] |\r\n// | Resume() |\r\n// V |\r\n// [ Resuming ] ---------'\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe pull-based design allows pause to be implemented by setting the playback rate to zero, causing the audio and video renderers to stop requesting data from upstream filters.  Without any pending requests the entire pipeline enters an implicit paused state.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Integration\" /\u003eIntegration\u003c/h3\u003e\r\n\u003cdiv\u003eThe following diagram shows the current integration of the media playback pipeline into WebKit and Chromium browser; this is slightly out of date, but the gist remains the same.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#888\" cellspacing\u003d\"0\" style\u003d\"border-collapse:collapse;border-top-color:rgb(136,136,136);border-right-color:rgb(136,136,136);border-bottom-color:rgb(136,136,136);border-left-color:rgb(136,136,136);border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e\r\n\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1259966540019/developers/design-documents/video/video_stack_chrome.png\" /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"width:379px;height:577px\"\u003e \u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(1) WebKit requests to create a media player, which in Chromium's case creates WebMediaPlayerImpl and Pipeline.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(2) BufferedDataSource requests to fetch the current video URL via ResourceLoader.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(3) ResourceDispatcher forwards the request to the browser process.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(4) A URLRequest is created for the request, which may already have cached data present in HttpCache.  Data is sent back to BufferedDataSource as it becomes available.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(5) FFmpeg demuxes and decodes audio/video data.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(6) Due to sandboxing, AudioRendererImpl cannot open an audio device directly and requests the browser to open the device on its behalf.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(7) The browser opens a new audio device and forwards audio callbacks to the corresponding render process.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n(8) Invalidates are sent to WebKit as new frames are available.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/video"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4092538734283380888"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4092538734283380888"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4092538734283380888"}],"author":[{"name":{"$t":"Andrew Scherkus"},"email":{"$t":"scherkus@chromium.org"}}],"sites$pageName":{"$t":"video"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5302594218963056229"},"published":{"$t":"2014-10-27T03:21:20.345Z"},"updated":{"$t":"2018-04-05T11:47:48.809Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-05T11:47:46.772Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GYP build parameters"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eChromium no longer uses GYP but GN. The corresponding page is \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gn-build-configuration\"\u003eGN build configuration.\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eHence, the following is \u003cb\u003e\u003cfont color\u003d\"#ff0000\"\u003eobsolete\u003c/font\u003e\u003c/b\u003e.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eGYP has many \u003c/span\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003eenvironment variables\u003c/b\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e that configure the way Chrome is built. By modifying these parameters, you can build chrome for different architectures, or speed up the build process. Generally, we strive to have good defaults and you shouldn't have to set many of these. The wiki also has some additional tips on \u003ca href\u003d\"https://code.google.com/p/chromium/wiki/CommonBuildTasks\"\u003ecommon build tasks\u003c/a\u003e.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2 style\u003d\"color:rgb(51,51,51);line-height:19px;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Specifying-parameters\" /\u003eSpecifying parameters\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"color:rgb(51,51,51);line-height:19px;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Command-line\" /\u003eCommand-line\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"color:rgb(51,51,51);line-height:19px\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eTo specify build parameters for GYP, you can do so on the command line:\u003c/span\u003e\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;color:rgb(51,51,51);line-height:19px;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e$ ./build/gyp_chromium -Dchromeos\u003d1 -Dcomponent\u003dshared_library\u003c/pre\u003e\r\n\u003cdiv style\u003d\"color:rgb(51,51,51);line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Environment-variable\" /\u003eEnvironment variable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"color:rgb(51,51,51);line-height:19px\"\u003eOr with an environment variable:\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;color:rgb(51,51,51);line-height:19px;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e$ export GYP_DEFINES\u003d\"chromeos\u003d1 component\u003dshared_library\"\r\n$ ./build/gyp_chromium\u003c/pre\u003e\r\n\u003cdiv style\u003d\"color:rgb(51,51,51);line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-chromium.gyp_env-file\" /\u003echromium.gyp_env file\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"color:rgb(51,51,51);line-height:19px\"\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eOr in \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003ea\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003echromium.gyp_env\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e file in your\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003echromium\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e directory:\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cpre style\u003d\"color:rgb(51,51,51);font-size:10pt;line-height:19px;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e$ echo \"{ 'GYP_DEFINES': 'chromeos\u003d1 component\u003dshared_library' }\" \u0026gt; ../chromium.gyp_env\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003cfont color\u003d\"#333333\"\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Some-common-file-examples:\" /\u003eSome common file examples:\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cb\u003eWindows\u003c/b\u003e:\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e{ 'GYP_DEFINES': 'component\u003dshared_library' }\u003c/pre\u003e\r\n\u003cdiv\u003e\u003cb\u003eMac\u003c/b\u003e:\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e{ 'GYP_DEFINES': 'fastbuild\u003d1' }\u003c/pre\u003e\r\n\u003cdiv\u003e\u003cb\u003eLinux\u003c/b\u003e:\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e{ 'GYP_DEFINES': 'component\u003dshared_library remove_webcore_debug_symbols\u003d1' }\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch2 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-ChromeOS-on-Linux:\" /\u003e\u003cspan style\u003d\"font-size:13px\"\u003eChromeOS \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eon Linux:\u003c/span\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e{ 'GYP_DEFINES': 'chromeos\u003d1 component\u003dshared_library remove_webcore_debug_symbols\u003d1' }\u003c/pre\u003e\r\n\u003cdiv\u003e\r\n\u003ch2 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Android:\" /\u003e\u003cspan style\u003d\"font-size:13px\"\u003eAndroid\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e:\u003c/span\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e{ 'GYP_DEFINES': 'OS\u003dandroid' }\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2 style\u003d\"margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Recommended-Parameters\" /\u003eRecommended Parameters\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eFor a full list of the main build variables and their defaults, see the\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003evariables\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e section in any \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003e*.gyp\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003eor \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003e*.gypi\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e file, e.g.\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e:\u003c/span\u003e\u003c/div\u003e\r\n\u003cpre style\u003d\"font-size:10pt;padding:5px 20px;margin-left:20px;font-family:Consolas,Courier New;background-image:initial;background-color:rgb(238,238,238);background-repeat:initial\"\u003e$ cat build/common.gypi\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003cdiv style\u003d\"color:rgb(0,0,0);line-height:normal\"\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003e\r\n\u003ctable cellpadding\u003d\"10px\" cellspacing\u003d\"10px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Variable\" /\u003eVariable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Explanation\" /\u003eExplanation\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Linux\" /\u003eLinux\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Windows\" /\u003eWindows\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Mac\" /\u003eMac\u003c/h3\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003ecomponent\u003dshared_library\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eIf you dynamically link, you save a lot of time linking for a small time cost during startup. On Windows, this uses a DLL build and incremental linking, which makes linking much faster in Debug.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003efastbuild\u003d1\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\u003cb\u003eOptional: removes all debug information, but builds much faster. \u003c/b\u003e0 means all debug symbols (.pdb generated from .obj), 1 means link time symbols (.pdb generated from .lib) and 2 means no pdb at all (no debug information). In practice 0 and 1, will generate the exact same PE. Only 2 will generate a PE that could have it's .rdata to be ~40 bytes smaller.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\r\n\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eremove_webcore_debug_symbols\u003d1\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eIf you don't need to trace into WebKit, you can cut down the size and slowness of debug builds significantly by building WebKit without debug symbols.\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204);text-align:center;vertical-align:middle\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"color:rgb(0,0,0);line-height:normal;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Building-a-release-build\" /\u003eBuilding a release build\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"line-height:19px\"\u003eTo build Chrome in a release build, as well as building in the \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003eout/Release\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;background-color:transparent\"\u003e directory, you may add the following flags:\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003cspan style\u003d\"line-height:19px;background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003ctable cellpadding\u003d\"10px\" cellspacing\u003d\"10px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Variable1\" /\u003eVariable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Explanation1\" /\u003eExplanation\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Linux1\" /\u003eLinux\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Windows1\" /\u003eWindows\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Mac1\" /\u003eMac\u003c/h3\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003ebuildtype\u003dOfficial\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eBuilds the heavily optimized official release build (invalid for builds in \u003cspan style\u003d\"font-family:Consolas,Courier New;font-size:13.3333px;background-color:rgb(238,238,238)\"\u003eout/Debug\u003c/span\u003e). Other options include 'Dev', for development/testing. Official builds take \u003cb\u003e\u003ci\u003edrastically\u003c/i\u003e\u003c/b\u003e longer to build, and are most likely not what you want.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003ebranding\u003dChrome\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eChanges the branding from 'Chromium' to 'Chrome', for official builds.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"color:rgb(0,0,0);line-height:normal;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Use-goma-distributed-build-Googlers-only-\" /\u003eUse goma distributed build (Googlers only)\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"line-height:19px;background-color:transparent\"\u003eSee \u003ca href\u003d\"https://sites.google.com/a/google.com/goma/\" rel\u003d\"nofollow\"\u003ego/ma\u003c/a\u003e for more information on how to set up goma.\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"color:rgb(0,0,0);line-height:normal;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Use-the-icecc-linker-Linux-only-\" /\u003eUse the icecc linker (Linux only)\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"line-height:19px\"\u003e\u003ca href\u003d\"https://github.com/icecc/icecream\" rel\u003d\"nofollow\"\u003eIcecc\u003c/a\u003e is the distributed compiler with a central scheduler to share build load. Currently, many external contributors use it. e.g. Intel, Opera, Samsung.\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003cdiv style\u003d\"color:rgb(0,0,0);line-height:normal\"\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003e\r\n\u003ctable cellpadding\u003d\"10px\" cellspacing\u003d\"10px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Variable2\" /\u003eVariable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Explanation2\" /\u003eExplanation\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Linux2\" /\u003eLinux\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Windows2\" /\u003eWindows\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Mac2\" /\u003eMac\u003c/h3\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003elinux_use_bundled_binutils\u003d0\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e-B option is not supported. See \u003ca href\u003d\"https://github.com/icecc/icecream/commit/b2ce5b9cc4bd1900f55c3684214e409fa81e7a92\" rel\u003d\"nofollow\"\u003ethis commit\u003c/a\u003e for more details.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003elinux_use_debug_fission\u003d0\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\u003ca href\u003d\"http://gcc.gnu.org/wiki/DebugFission\" rel\u003d\"nofollow\"\u003eDebug fission\u003c/a\u003e is not supported. See \u003ca href\u003d\"https://github.com/icecc/icecream/issues/86\" rel\u003d\"nofollow\"\u003ethis bug\u003c/a\u003e for more details.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eclang\u003d0\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eIcecc doesn't support clang yet.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\" /\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"color:rgb(0,0,0);line-height:normal;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Build-ChromeOS-on-Linux-Linux-only-\" /\u003eBuild ChromeOS on Linux (Linux only)\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003eTo build ChromeOS on Linux, use the following gyp variables and the regular\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003echrome\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"line-height:19px\"\u003etarget will run ChromeOS instead of Chrome.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"color:rgb(0,0,0);line-height:normal\"\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003e\r\n\u003ctable cellpadding\u003d\"10px\" cellspacing\u003d\"10px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Variable3\" /\u003eVariable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Explanation3\" /\u003eExplanation\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Linux3\" /\u003eLinux\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Windows3\" /\u003eWindows\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Mac3\" /\u003eMac\u003c/h3\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003echromeos\u003d1\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eBuild for the ChromeOS platform instead of Linux.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\" /\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003ch3 style\u003d\"color:rgb(0,0,0);line-height:normal;margin-bottom:5px\"\u003e\u003ca name\u003d\"TOC-Build-Android-Linux-only-\" /\u003eBuild Android (Linux only)\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"line-height:normal\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003eTo build ChromeOS on Linux, use the following gyp variables and the either the\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003echrome_shell_apk\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;line-height:19px;background-color:transparent\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"line-height:19px;font-size:10pt;padding:2px 5px;font-family:Consolas,Courier New;background:rgb(238,238,238)\"\u003ewebview_instrumentation_apk\u003c/span\u003e\u003cspan style\u003d\"line-height:19px;font-size:10pt;background-color:transparent\"\u003e \u003c/span\u003e\u003cspan style\u003d\"line-height:19px;font-size:10pt;background-color:transparent\"\u003etarget.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"line-height:19px\"\u003e\r\n\u003cdiv style\u003d\"color:rgb(0,0,0);line-height:normal\"\u003e\u003cfont color\u003d\"#333333\"\u003e\u003cspan style\u003d\"line-height:19px\"\u003e\r\n\u003ctable cellpadding\u003d\"10px\" cellspacing\u003d\"10px\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Variable4\" /\u003eVariable\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Explanation4\" /\u003eExplanation\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Linux4\" /\u003eLinux\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Windows4\" /\u003eWindows\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\r\n\u003ch3 style\u003d\"margin-bottom:5px;margin-top:0px\"\u003e\u003ca name\u003d\"TOC-Mac4\" /\u003eMac\u003c/h3\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eOS\u003dandroid\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003eBuild for the Android platform instead of Linux.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003etarget_arch\u003dia32\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\u003cb\u003eOptional. \u003c/b\u003eUse this if building for x86 targets.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003etarget_arch\u003dmipsel\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(204,204,204)\"\u003e\u003cb\u003eOptional. \u003c/b\u003eUse this if building for MIPS targets.\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables/menu_check.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1415143925293/developers/gyp-environment-variables/menu_check.png\" /\u003e\u003c/a\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;border:1px solid rgb(204,204,204);text-align:center\" /\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/gyp-environment-variables"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5302594218963056229"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5302594218963056229"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5302594218963056229"}],"author":[{"name":{"$t":"Sasha Bermeister"},"email":{"$t":"sashab@chromium.org"}}],"sites$pageName":{"$t":"gyp-environment-variables"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"XCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8942633318364261387"},"published":{"$t":"2011-07-12T17:06:46.877Z"},"updated":{"$t":"2018-04-04T22:45:34.379Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-04-04T22:45:32.173Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"WebUI browser_tests"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cb\u003e\u003ci\u003eNote: This page is out of date. If you are using modern practices, you are using a BrowserProxy for your JS/C++ interactions. The \u003ca href\u003d\"https://docs.google.com/document/d/1c20VYdwpUPyBRQeAS0CMr6ahwWnb0s26gByomOwqDjk/edit\"\u003eBrowserProxy\u003c/a\u003e document covers some testing practices for that case.\u003c/i\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont size\u003d\"6\"\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\r\n\u003c/i\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cs\u003e\r\n\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Problem\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eProblem\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Objective\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eObjective\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Solution\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eSolution\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-to-write-a-test\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eHow to write a test\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-maybe-create-a-new-test-file\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003e[maybe] create a new test file\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Write-a-test-fixture-defining-the-page-to-browse-to:\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eWrite a test fixture, defining the page to browse to:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mock-the-Javascript-handler:\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eMock the Javascript handler:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Mock-stubs-which-call-a-function:\"\u003e\u003cstrong\u003e4.4 \u003c/strong\u003eMock stubs which call a function:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Define-a-test-using-mock-expectations:\"\u003e\u003cstrong\u003e4.5 \u003c/strong\u003eDefine a test using mock expectations:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Conditionally-run-a-test-using-generated-c-ifdefs:-See-Handling-a-failing-test-for-more-details-on-style-and-how-when-to-disable-a-test.\"\u003e\u003cstrong\u003e4.6 \u003c/strong\u003eConditionally run a test using generated c++ ifdefs: See Handling a failing test for more details on style and how/when to disable a test.\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Maintaining\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eMaintaining\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Considerations-FAQs\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eConsiderations/FAQs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Caveats\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eCaveats\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Best-practices\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eBest practices\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Problem\" /\u003eProblem\u003c/h3\u003e\r\n\u003cdiv\u003eSee Also \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/domui-testing\"\u003edomui-testing\u003c/a\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWebUI contains Javascript, which runs in the renderer and a C++ handler, which runs in the UI thread of the browser process. While this is a necessary part of the design, testing across these boundaries of both language and process/thread is cumbersome at best.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Objective\" /\u003eObjective\u003c/h3\u003e\r\n\u003cdiv\u003eMake it possible to test the Javascript portion of WebUI in Javascript:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eWrite WebUI tests in Javascript.\u003c/li\u003e\r\n\u003cli\u003eRun in browser_tests so that the page is loaded in a real chrome browser.\u003c/li\u003e\r\n\u003cli\u003eAllow WebUI handlers to be mocked in Javascript.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Solution\" /\u003eSolution\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe solution comes in the following parts:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eSupport libraries: \u003ccode\u003echrome/test/data/webui/test_api.js\u003c/code\u003e, \u003ccode\u003echrome/third_party/mock4js/mock4js.js\u003c/code\u003e.\u003c/li\u003e\r\n\u003cli\u003egyp rules for js2webui generator feeding results into browser_tests.\u003c/li\u003e\r\n\u003cli\u003eWebUIBrowserTest C++ class in \u003ccode\u003echrome/browser/ui/webui/web_ui_browsertest*\u003c/code\u003e .\u003c/li\u003e\r\n\u003cli\u003eTest source files next to the implementation or in chrome/test/data/webui/ - see chrome/browser/ui/webui/options/options_browsertest.js and chrome/test/data/webui/print_preview.js for reference.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-to-write-a-test\" /\u003eHow to write a test\u003c/h3\u003e\r\n\u003cdiv\u003eThe best reference examples are chrome/test/data/webui/print_preview.js and chrome/browser/ui/webui/options/options_browsertest.js\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-maybe-create-a-new-test-file\" /\u003e\r\n\u003cul\u003e\u003cli\u003e[maybe] create a new test file\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/h4\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003eCreate new file \u003ccode\u003echrome/test/data/webui/\u003c/code\u003e\u003ci\u003e\u003ccode\u003emytest\u003c/code\u003e\u003c/i\u003e\u003ccode\u003e.js\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eAdd \u003ccode\u003echrome/test/data/webui/\u003c/code\u003e\u003ci\u003e\u003ccode\u003emytest\u003c/code\u003e\u003c/i\u003e\u003ccode\u003e.js\u003c/code\u003e to the sources for browser_tests in \u003ccode\u003echrome/chrome_tests.gypi\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Write-a-test-fixture-defining-the-page-to-browse-to:\" /\u003e\r\n\u003cul\u003e\u003cli\u003eWrite a test fixture, defining the page to browse to:\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e/**\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e * TestFixture for OptionsPage WebUI testing.\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e * @extends {testing.Test}\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e * @constructor\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e **/\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003efunction OptionsWebUITest() {}\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003eOptionsWebUITest.prototype \u003d {\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e  __proto__: testing.Test.prototype,\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  /**\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   * Browse to the options page \u0026amp; call our preLoad().\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e   **/\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  browsePreload: 'chrome://settings-frame',\u003c/code\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003ccode\u003e  // ...\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e};\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Mock-the-Javascript-handler:\" /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMock the Javascript handler:\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\r\n\u003cdiv\u003e\u003cfont\u003e\u003ccode\u003eOptionsWebUITest.prototype \u003d {\u003c/code\u003e\u003c/font\u003e\u003c/div\u003e\r\n\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e...\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e  /**\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e   * Register a mock handler to ensure expectations are met and options pages\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e   * behave correctly.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e   **/\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e  preLoad: function() {\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e      this.makeAndRegisterMockHandler(\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e            ['defaultZoomFactorAction',\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e        \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e 'fetchPrefs',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e        \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e 'observePrefs',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'setBooleanPref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'setIntegerPref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'setDoublePref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'setStringPref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'setObjectPref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'clearPref',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e         \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e'coreOptionsUserMetricsAction',\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e        \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e]);\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e      // Register stubs for methods expected to be called before/during tests.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e    \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003e// Specific expectations can be made in the tests themselves.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e    \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003ethis.mockHandler.stubs().fetchPrefs(ANYTHING);\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e    \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003ethis.mockHandler.stubs().observePrefs(ANYTHING);\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e    \u003c/font\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:12.800000190734863px\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(56,118,29);font-family:arial,sans-serif;font-size:medium;line-height:1\"\u003ethis.mockHandler.stubs().coreOptionsUserMetricsAction(ANYTHING);\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"line-height:1\"\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e  },\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e...\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#38761d\" face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e};\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Mock-stubs-which-call-a-function:\" /\u003e\r\n\u003cul\u003e\u003cli\u003eMock stubs which call a function:\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003e\u003ccode\u003e    mockHandler.stubs().getDefaultPrinter().\u003cbr /\u003e\r\n\u003c/code\u003e\u003ccode\u003e        will(callFunction(function() {\u003cbr /\u003e\r\n\u003c/code\u003e\u003ccode\u003e          setDefaultPrinter('FooDevice');\u003cbr /\u003e\r\n\u003c/code\u003e\u003ccode\u003e        }));\u003c/code\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Define-a-test-using-mock-expectations:\" /\u003e\r\n\u003cul\u003e\u003cli\u003eDefine a test using mock expectations:\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ccode\u003eTEST_F('OptionsWebUITest', 'testSetBooleanPrefTriggers', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var showHomeButton \u003d $('toolbarShowHomeButton');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var trueListValue \u003d [\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    'browser.show_home_button',\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    true,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    'Options_Homepage_HomeButton',\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  ];\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  // Note: this expectation is checked in testing::Test::TearDown.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  this.mockHandler.expects(once()).setBooleanPref(trueListValue);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  // Cause the handler to be called.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  showHomeButton.click();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  showHomeButton.blur();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Conditionally-run-a-test-using-generated-c-ifdefs:-See-Handling-a-failing-test-for-more-details-on-style-and-how-when-to-disable-a-test.\" /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eConditionally run a test using generated c++ ifdefs:\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eSee \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/handling-a-failing-test\"\u003eHandling a failing test\u003c/a\u003e for more details on style and how/when to disable a test.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ccode\u003e// Not meant to run on ChromeOS at this time.\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e// Not finishing in windows. http://crbug.com/81723\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('#if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) \\\\');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('    || defined(TOUCH_UI)');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('#define MAYBE_testRefreshStaysOnCurrentPage \\\\');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('    DISABLED_testRefreshStaysOnCurrentPage');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('#else');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('#define MAYBE_testRefreshStaysOnCurrentPage ' +\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    'testRefreshStaysOnCurrentPage');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eGEN('#endif');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eTEST_F('OptionsWebUITest', 'MAYBE_testRefreshStaysOnCurrentPage', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var item \u003d $('advancedPageNav');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  item.onclick();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  window.location.reload();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var pageInstance \u003d AdvancedOptions.getInstance();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var topPage \u003d OptionsPage.getTopmostVisiblePage();\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var expectedTitle \u003d pageInstance.title;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var actualTitle \u003d document.title;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(\"chrome://settings/advanced\", document.location.href);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(expectedTitle, actualTitle);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(pageInstance, topPage);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Maintaining\" /\u003eMaintaining\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAdding more goodies to generator - edit \u003ccode\u003echrome/test/ui/webui/javascript2webui.js\u003c/code\u003e and tests in \u003ccode\u003echrome/test/data/webui/\u003c/code\u003e.\u003c/li\u003e\r\n\u003cli\u003eDisabling a test - find tests in \u003ccode\u003echrome/test/data/webui/\u003c/code\u003e \u0026amp; mark \u003ccode\u003eFLAKY_\u003c/code\u003e, \u003ccode\u003eDISABLED_\u003c/code\u003e or use the \u003ccode\u003eMAYBE_\u003c/code\u003e trick shown above to conditionally decide.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Considerations-FAQs\" /\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003eConsiderations/FAQs\u003c/span\u003e\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ci\u003eIsn't mocking in javascript not testing the WebUI message passing?\u003c/i\u003e  True, but that should be tested as a unit test and then trusted.  Mocking in JS is easier, less flaky (always recursive - no synchronization challenges) and much better than not having any tests at all.\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003eIf you already have the page in question why don't you just run all tests without starting a new IN_PROCESS_BROWSER_TEST?\u003c/i\u003e You are more than welcome to group tons of expect* calls into a single test; all errors will be reported after the entire test runs. Having tests be separate IN_PROCESS_BROWSER_TEST calls ensures the state is exactly the same at the start of each tests with no pollution from previous tests.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Caveats\" /\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003eCaveats\u003c/span\u003e\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e[\u003ca href\u003d\"http://crbug.com/88104\"\u003ecrbug.com/88104\u003c/a\u003e] The generator relies on \u003cspan style\u003d\"font-size:12px;white-space:pre-wrap;background-color:transparent\"\u003ed8\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e to be built for the host.  Currently the v8.gyp rules aren't correct for Arm as they have conditionals on the 'target_host' and don't heed the 'toolset\". A gyp condition only runs the js2webui rule on non-arm platforms.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eUse of \u003ccode\u003eMAYBE_\u003c/code\u003e to ifdef will have a different run name from GTEST than from \u003ccode\u003etest_api.js\u003c/code\u003e - this is because \u003ccode\u003eMAYBE_xyz\u003c/code\u003e will be defined as either \u003ccode\u003exyz\u003c/code\u003e or \u003ccode\u003eDISABLED_xyz\u003c/code\u003e in C++, but not changed in javascript.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Best-practices\" /\u003eBest practices\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAs described in the \u003ca href\u003d\"http://code.google.com/p/googletest/\"\u003egtest docs\u003c/a\u003e, prefer expect* over assert*, as it will not halt the test, but will register the failure and allow other checks in that particular testcase to run.\u003c/li\u003e\r\n\u003cli\u003eSince the call is included in the failure error message, the optional \u003ccode\u003emessage\u003c/code\u003e parameter should only include information not available:\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ccode\u003e// NO\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eTEST_F('FooTest', 'TestFoo', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(foo, bar, 'foo !\u003d bar');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(foo, bar, foo + '!\u003d' + bar);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var i \u003d ...;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(5, array[i], 'array[i] !\u003d 5');\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e// YES\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ccode\u003eTEST_F('FooTest', 'TestFoo', function() {\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(foo, bar);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(foo, bar);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  var i \u003d ...;\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  expectEquals(5, array[i], 'i\u003d' + i);\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e});\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/s\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/39962618958524957"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/domui-testing/webui-browser_tests"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8942633318364261387"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8942633318364261387"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8942633318364261387"}],"author":[{}],"sites$pageName":{"$t":"webui-browser_tests"},"sites$revision":{"$t":"35"}},{"gd$etag":"\"KXsmYD1bFQ..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8649171594513493687"},"published":{"$t":"2011-03-31T17:06:10.060Z"},"updated":{"$t":"2018-03-30T06:21:25.418Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-30T06:21:23.797Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GPU Bots \u0026 Pixel Wrangling"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/gpu/pixel_wrangling.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/gpu/pixel_wrangling.md\u003c/a\u003e.\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/gpu-wrangling"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8649171594513493687"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8649171594513493687"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8649171594513493687"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$pageName":{"$t":"gpu-wrangling"},"sites$revision":{"$t":"123"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5554235024187778603"},"published":{"$t":"2012-12-18T03:44:27.935Z"},"updated":{"$t":"2018-03-30T06:20:22.100Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-30T06:20:20.409Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging GPU related code"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/gpu/debugging_gpu_related_code.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/gpu/debugging_gpu_related_code.md\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/debugging-gpu-related-code"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5554235024187778603"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5554235024187778603"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5554235024187778603"}],"author":[{"name":{"$t":"Gregg Tavares"},"email":{"$t":"gman@chromium.org"}}],"sites$pageName":{"$t":"debugging-gpu-related-code"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5962613552360474467"},"published":{"$t":"2016-02-20T00:42:37.985Z"},"updated":{"$t":"2018-03-30T06:19:24.162Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-30T06:19:22.328Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GPU Bot Details"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/gpu/gpu_testing_bot_details.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/gpu/gpu_testing_bot_details.md\u003c/a\u003e.\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2959164455886606854"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/gpu-testing/gpu-bot-details"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5962613552360474467"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5962613552360474467"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5962613552360474467"}],"author":[{"name":{"$t":"Kenneth Russell"},"email":{"$t":"kbr@chromium.org"}}],"sites$pageName":{"$t":"gpu-bot-details"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"UCl7JmA6\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2959164455886606854"},"published":{"$t":"2014-02-22T00:42:21.831Z"},"updated":{"$t":"2018-03-30T06:18:48.338Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-30T06:18:45.638Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GPU Testing"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis page has moved to \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/docs/gpu/gpu_testing.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/docs/gpu/gpu_testing.md\u003c/a\u003e.\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/gpu-testing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2959164455886606854"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2959164455886606854"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2959164455886606854"}],"author":[{"name":{"$t":"Kenneth Russell"},"email":{"$t":"kbr@chromium.org"}}],"sites$pageName":{"$t":"gpu-testing"},"sites$revision":{"$t":"69"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2885166437433167452"},"published":{"$t":"2012-02-13T23:48:39.866Z"},"updated":{"$t":"2018-03-30T00:54:18.251Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-30T00:54:16.061Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"JNI on Chromium for Android"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Moved-to:-https:-chromium.googlesource.com-chromium-src-master-base-android-jni_generator-README.md\" /\u003e\u003cspan style\u003d\"font-size:13.3333px;font-weight:400\"\u003eMoved to: \u003ca href\u003d\"https://chromium.googlesource.com/chromium/src/+/master/base/android/jni_generator/README.md\"\u003ehttps://chromium.googlesource.com/chromium/src/+/master/base/android/jni_generator/README.md\u003c/a\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/android-jni"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2885166437433167452"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2885166437433167452"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2885166437433167452"}],"author":[{"name":{"$t":"Marcus Bulach"},"email":{"$t":"bulach@chromium.org"}}],"sites$pageName":{"$t":"android-jni"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4113303015903853436"},"published":{"$t":"2018-03-22T05:25:03.823Z"},"updated":{"$t":"2018-03-22T05:25:03.997Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-22T05:25:03.823Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"site-isolation-flag-2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4113303015903853436"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8782662320331283373"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation/site-isolation-flag-2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4113303015903853436"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4113303015903853436"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4113303015903853436"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4113303015903853436"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3266270404006508835"},"published":{"$t":"2018-03-22T05:19:51.376Z"},"updated":{"$t":"2018-03-22T05:19:51.539Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-22T05:19:51.376Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"site-isolation-flag-1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3266270404006508835"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8782662320331283373"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/site-isolation/site-isolation-flag-1.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3266270404006508835"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3266270404006508835"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3266270404006508835"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3266270404006508835"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},"published":{"$t":"2012-10-24T20:33:02.950Z"},"updated":{"$t":"2018-03-08T01:13:12.998Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-08T01:13:11.107Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chaps Technical Design"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-3\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Objective\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eObjective\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Rationale\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eRationale\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Audience\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eAudience\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Resources\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eResources\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eOverview\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Staging\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eStaging\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Infrastructures\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eInfrastructures\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Inter-Process-Communication-IPC-\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eInter-Process Communication (IPC)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Persistence\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003ePersistence\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-TPM-Software-Layers\"\u003e\u003cstrong\u003e6.3 \u003c/strong\u003eTPM Software Layers\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Testing\"\u003e\u003cstrong\u003e6.4 \u003c/strong\u003eTesting\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Detailed-Design\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eDetailed Design\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-TPM-Interaction\"\u003e\u003cstrong\u003e7.1 \u003c/strong\u003eTPM Interaction\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Phase-1---Introduce-chapsd:\"\u003e\u003cstrong\u003e7.1.1 \u003c/strong\u003ePhase 1 - Introduce chapsd:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Phase-2---Replace-openCryptoki:\"\u003e\u003cstrong\u003e7.1.2 \u003c/strong\u003ePhase 2 - Replace openCryptoki:\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Phase-3---Do-more-in-software:\"\u003e\u003cstrong\u003e7.1.3 \u003c/strong\u003ePhase 3 - Do more in software:\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chaps-Classes\"\u003e\u003cstrong\u003e7.2 \u003c/strong\u003eChaps Classes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Marshalling\"\u003e\u003cstrong\u003e7.3 \u003c/strong\u003eMarshalling\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Schema\"\u003e\u003cstrong\u003e7.4 \u003c/strong\u003eSchema\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Deployment\"\u003e\u003cstrong\u003e7.5 \u003c/strong\u003eDeployment\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Phase-1\"\u003e\u003cstrong\u003e7.5.1 \u003c/strong\u003ePhase 1\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Phase-2\"\u003e\u003cstrong\u003e7.5.2 \u003c/strong\u003ePhase 2\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Project-Information\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eProject Information\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Internationalization-and-Localization\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eInternationalization and Localization\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Security-Considerations\"\u003e\u003cstrong\u003e10 \u003c/strong\u003eSecurity Considerations\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Key-Storage-Example\"\u003e\u003cstrong\u003e10.1 \u003c/strong\u003eKey Storage Example\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cryptography\"\u003e\u003cstrong\u003e10.2 \u003c/strong\u003eCryptography\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Random-Numbers\"\u003e\u003cstrong\u003e10.2.1 \u003c/strong\u003eRandom Numbers\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-PKCS-11-Software-Mechanisms\"\u003e\u003cstrong\u003e10.2.2 \u003c/strong\u003ePKCS #11 Software Mechanisms\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Encryption-Authentication-of-Persistent-Objects\"\u003e\u003cstrong\u003e10.2.3 \u003c/strong\u003eEncryption / Authentication of Persistent Objects\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Authorization-Data-Hashes\"\u003e\u003cstrong\u003e10.2.4 \u003c/strong\u003eAuthorization Data Hashes\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Logging-Plan\"\u003e\u003cstrong\u003e11 \u003c/strong\u003eLogging Plan\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Testing-Plan\"\u003e\u003cstrong\u003e12 \u003c/strong\u003eTesting Plan\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Unit-Integration-Tests\"\u003e\u003cstrong\u003e12.1 \u003c/strong\u003eUnit / Integration Tests\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Client-side-Unit-Tests\"\u003e\u003cstrong\u003e12.1.1 \u003c/strong\u003eClient-side Unit Tests\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Daemon-side-Unit-Integration-Tests\"\u003e\u003cstrong\u003e12.1.2 \u003c/strong\u003eDaemon-side Unit / Integration Tests\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Objective\" /\u003eObjective\u003c/h2\u003e\r\n\u003cp\u003eChaps is a PKCS #11 implementation that provides trusted platform module (TPM) backed cryptographic services.  It replaces openCryptoki as the provider of TPM-backed cryptographic services on Chrome OS.  It aims to improve speed and reliability of cryptographic token operations as well as to provide a simpler and more flexible codebase for future enhancements.  Chaps works with a TCG Software Stack (TSS).  On Chrome OS the TrouSerS TSS implementation is used, but Chaps is not limited to working with TrouSerS.  The name \"Chaps\" has no real significance other than its fitness as a name for a layer above TrouSerS.  \u003c/p\u003e\r\n\u003cp\u003eThe following diagram illustrates where Chaps fits in the cryptographic services stack.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ChapsStack.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1351112433096/developers/design-documents/chaps-technical-design/ChapsStack.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Rationale\" /\u003eRationale\u003c/h2\u003e\r\n\r\n\u003cp\u003eThe motivation for creating Chaps and phasing out openCryptoki is threefold:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eStability - There have been numerous bugs and quirks that are difficult to find and sometimes messy to fix. We want a module that is designed to be highly testable and that lends itself to automated testing.\u003c/li\u003e\r\n\u003cli\u003ePerformance - TPMs are notoriously slow, and we want to both leverage security and optimize performance.\u003c/li\u003e\r\n\u003cli\u003eIntegration - We want a module that integrates well with Chrome OS and how Chrome OS uses TPM-backed cryptographic services.  openCryptoki does not meet this criteria, and some future considerations, such as multi-token scenarios, are not possible with openCryptoki.  We also want code that will be easy to enhance in the future.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Audience\" /\u003eAudience\u003c/h2\u003e\r\nThis document is for engineers, system integrators, and security analysts interested in the details of Chrome OS security.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Resources\" /\u003eResources\u003c/h2\u003e\r\n\r\n\u003cp\u003eThe following resources provide useful background to this document:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003e\u003ca href\u003d\"http://trousers.sourceforge.net/pkcs11.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eTrouSers PKCS #11 Interface Docs\u003c/span\u003e\u003c/a\u003e: OpenCryptoki is currently used with a plugin from the TrouSerS project to provide the TPM-specific implementation.  This link provides details on the plugin and the model it implements.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.rsa.com/rsalabs/node.asp?id\u003d2133\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ePKCS #11: Cryptographic Token Interface Standard\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.trustedcomputinggroup.org/files/resource_files/6479CD77-1D09-3519-AD89EAD1BC8C97F0/TSS_1_2_Errata_A-final.pdf\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003eTCG Software Stack Specification\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\r\n\r\n\u003cp\u003eChaps has two major components:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Courier New;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003echapsd\u003c/span\u003e - A daemon that receives and handles PKCS #11 calls via the D-Bus.  This daemon is always running and starts at boot.\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:Courier New;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003elibchaps.so\u003c/span\u003e - A library that exports the PKCS #11 interface and communicates with \u003cspan style\u003d\"font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003echapsd\u003c/span\u003e.  An application loads and uses this library like any other PKCS #11 library.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eChaps reports two slots: (1) a system slot (not currently enabled) and (2) a user slot.  The system slot will always have a token available.  The user slot will have a token available while a user is logged in.  chapsd receives login/logout notifications from cryptohome.  The login notification must provide the user password (or some password-derived value) that will be used as authorization data for TPM-protected keys.  Cryptohome derives the authorization data from the user password and a user-and-system-specific salt value using the scrypt key derivation scheme.\u003c/p\u003e\r\n\u003cp\u003eThis diagram shows the Chaps high-level architecture:\u003c/p\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ChapsArchitecture.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1351116430561/developers/design-documents/chaps-technical-design/ChapsArchitecture.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Staging\" /\u003eStaging\u003c/h3\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003ePhase 1 (enabled in Chrome OS version 18) - Introduce chapsd:\u003c/li\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eMarshaling of all PKCS #11 calls from libchaps.so to chapsd.\u003c/li\u003e\r\n\u003cli\u003echapsd redirection to openCryptoki.\u003c/li\u003e\r\n\u003cli\u003eIntegration of libchaps.so with all PKCS #11 applications.\u003c/li\u003e\r\n\u003cli\u003echapsd runs as chronos to play nice with existing openCryptoki files and facilitate a rollback in the event of unexpected problems.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003ePhase 2 (enabled in Chrome OS version 20) - Replace openCryptoki:\u003c/li\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003echapsd implementation (redirection to openCryptoki is removed).\u003c/li\u003e\r\n\u003cli\u003echapsd runs as a system user named \"chaps.\"\u003c/li\u003e\r\n\u003cli\u003eOpenCryptoki is removed from the system.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003ePhase 3 (optional) - Do more in software:\u003c/li\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eTPM-encrypted key store for faster RSA operations.  A TPM-protected symmetric key is used to encrypt a key store outside of the TPM.  This symmetric key will be much faster to load than RSA keys and can be temporarily cached.  The RSA keys are then stored in the key store and the cryptographic operations are performed in software.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Infrastructures\" /\u003eInfrastructures\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Inter-Process-Communication-IPC-\" /\u003eInter-Process Communication (IPC)\u003c/h3\u003e\r\nAll IPC with chapsd is performed using D-Bus.  Both the Chaps client and daemon use dbus-c++ to generate proxy and adaptor classes.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Persistence\" /\u003ePersistence\u003c/h3\u003e\r\nObject data is stored in \u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e/var/lib/chaps\u003c/span\u003e for the system token and in \u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e~/.chaps\u003c/span\u003e for each user.  The object database is implemented using LevelDB.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-TPM-Software-Layers\" /\u003eTPM Software Layers\u003c/h3\u003e\r\nThe TrouSers library is used to access TPM services from the TSPI layer. \u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Testing\" /\u003eTesting\u003c/h3\u003e\r\nUnit tests for Chaps use the gtest and gmock frameworks.  End-to-end tests use the autotest framework.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-Design\" /\u003eDetailed Design\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-TPM-Interaction\" /\u003eTPM Interaction\u003c/h3\u003e\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Phase-1---Introduce-chapsd:\" /\u003ePhase 1 - Introduce chapsd:\u003c/h4\u003e\r\n\r\n\u003cp\u003eIn Phase 1 all TPM interaction is still controlled by openCryptoki. The introduction of chapsd does not change TPM interaction in any way.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Phase-2---Replace-openCryptoki:\" /\u003ePhase 2 - Replace openCryptoki:\u003c/h4\u003e\r\n\r\n\u003cp\u003eAll RSA private keys with the attribute CKA_TOKEN set to TRUE will be bound to the TPM (wrapped by the Storage Root Key) and will not be extractable.  All other private data and non-RSA keys are stored encrypted by the User Encryption Key which is protected by the TPM’s SRK but is extractable.  This diagram depicts the key hierarchy:\r\n\r\n\u003c/p\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/KeyHierarchy.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1351117177175/developers/design-documents/chaps-technical-design/KeyHierarchy.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003ch5\u003e\u003ca name\u003d\"TOC-Authorization-Data\" /\u003eAuthorization Data\u003c/h5\u003e\r\n\u003cp\u003eAuthorization data for the User Authorization Key is derived from the user password using the scrypt scheme.  Salt is stored in a root-accessible file in the user’s home directory and is unique per user account per system.  This ensures that authorization data for the same user on two different systems is different.  The scrypt parameters are tuned to perform the computation in about 100ms.\u003c/p\u003e\r\n\u003cp\u003eAll other authorization data is randomly generated and stored encrypted with the User Encryption Key.  This authorization data is not directly encrypted with the User Authorization Key for performance reasons.  This does not reduce security since any attack on the key would require access to the TPM (and so decryption of authorization data by the TPM would be possible).\u003c/p\u003e\r\n\r\n\u003ch5\u003e\u003ca name\u003d\"TOC-Migration\" /\u003eMigration\u003c/h5\u003e\r\n\r\n\u003cp\u003eExisting TPM-protected keys cannot be migrated to this hierarchy.  The existing hierarchy is supported so that existing keys can continue to be used.  All other data including meta-data associated with TPM-protected keys that was previously stored in the openCryptoki object store can be migrated to the new persistent object store.  This migration will take place when valid openCryptoki object data is found in a user’s home directory and migration has not previously taken place.\u003c/p\u003e\r\n\r\n\u003ch5\u003e\u003ca name\u003d\"TOC-Multiple-Users\" /\u003eMultiple Users\u003c/h5\u003e\r\n\r\n\u003cp\u003eIn the future, simultaneous multiple user logins may need to be supported, and this design must accommodate this scenario.  Each slot maintains a distinct object database, a distinct User Authorization Key and User Encryption Key, and uses a distinct password.  Currently, only the \"system\" and \"user\" slots exist, but adding a new user would be as simple as adding another slot.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Phase-3---Do-more-in-software:\" /\u003ePhase 3 - Do more in software: \u003c/h4\u003e\r\n\r\n\u003cp\u003eThe key hierarchy for Phase 3 is the same as for Phase 2.  The difference is that in Phase 3 some RSA keys can be protected by the User Encryption Key rather than being directly TPM-protected.  Keys that require higher performance and do not require the high security of direct TPM binding are candidates for this.  There is no migration of existing RSA keys because they are not extractable.\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chaps-Classes\" /\u003eChaps Classes\u003c/h3\u003e\r\nChaps is implemented in C++ and makes wide use of mockable interfaces. This structure allows for a high level of unit test coverage. In general, all classes inherit from an interface class, and when one class interacts with another, it references the interface, not the implementation class.\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eChapsInterface - This interface is the C++ equivalent of the IPC contract between the Chaps client and daemon.  The actual interface used by dbus-c++ is described in XML.  ChapsInterface is implemented on the client side by ChapsProxyImpl and on the daemon side by ChapsServiceRedirect (Phase 1) and ChapsServiceImpl (Phase 2). The following diagram shows the class hierarchy and how the classes interact in practice.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ClassHierarchy.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1351117305438/developers/design-documents/chaps-technical-design/ClassHierarchy.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cp\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eChapsProxyImpl - This class implements ChapsInterface and forwards all calls to an instance of the dbus-c++ generated proxy class.\u003c/li\u003e\r\n\u003cli\u003eChapsAdaptor - This class implements the dbus-c++ generated adaptor interface and forwards all dbus calls to a ChapsInterface instance.\u003c/li\u003e\r\n\u003cli\u003eChapsServiceRedirect - This class implements ChapsInterface and forwards all calls to a PKCS #11 library.  In Phase 1 this class is hooked up to ChapsAdaptor and forwards incoming calls to openCryptoki.  In Phase 2 this class will no longer be used.\u003c/li\u003e\r\n\u003cli\u003eChapsServiceImpl - This class implements ChapsInterface and provides the actual Chaps implementation (in contrast to ChapsServiceRedirect).  This class is hooked up to ChapsAdaptor (in Phase 2) and serves as the entry point of all calls to chapsd.\u003c/li\u003e\r\n\u003cli\u003eChapsFactory - This class creates default instances of interface classes. In a test environment, a mock of this class can be configured to create the desired combination of real and mock objects.\u003c/li\u003e\r\n\u003cli\u003eSlotManager / SlotManagerImpl - This mockable class manages the state of all slots, the tokens in them, and maintains a list of sessions for each token.\u003c/li\u003e\r\n\u003cli\u003eSession / SessionImpl - This mockable class represents a session and manages all contextual information for a single session.\u003c/li\u003e\r\n\u003cli\u003eObjectPolicy - An instance of this class is bound to each object; it enforces all policies specified in PKCS #11 for the particular object type.  There is a subclass of this interface for each object type.\u003c/li\u003e\r\n\u003cli\u003eObject / ObjectImpl - This mockable class represents an object and is optionally persistent.\u003c/li\u003e\r\n\u003cli\u003eObjectPool / ObjectPoolImpl - This mockable class represents an unordered group of objects. An ObjectPool may or may not be backed by an ObjectStore.\u003c/li\u003e\r\n\u003cli\u003eObjectStore / ObjectStoreImpl - This mockable class implements a persistent object store.  This is the only class that references the LevelDB API.\u003c/li\u003e\r\n\u003cli\u003eTPMUtility / TPMUtilityImpl - This mockable class interfaces with the TrouSerS library for interaction with the TPM.\u003c/li\u003e\r\n\u003cli\u003eObjectImporter / OpencryptokiImporter - This mockable class imports objects from an external source. The openCryptoki-specific implementation imports objects from an openCryptoki database.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Marshalling\" /\u003e\u003cb\u003eMarshalling\u003c/b\u003e\u003c/h3\u003e\r\nAll marshalling is performed by dbus-c++ with the exception of template arguments (that is, CK_ATTRIBUTE lists), which are serialized using the protobuf library.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Schema\" /\u003eSchema\u003c/h3\u003e\r\nLevelDB is not relational, so a relational schema is not used. Objects are serialized and assigned a unique identifier. The keys in LevelDB are the object identifiers, and the values are serialized object blobs.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Deployment\" /\u003eDeployment\u003c/h3\u003e\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Phase-1\" /\u003ePhase 1\u003c/h4\u003e\r\n\r\n\u003cp\u003ePhase 1 deployment has the following goals:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eThe PKCS #11 system is fully functional following each individual CL.  This is necessary because multiple repositories are involved (for example, chaps, cryptohome, chrome, init, …).\u003c/li\u003e\r\n\u003cli\u003eA full rollback is possible at any time.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eThe following ordered deployment plan meets these goals:\u003c/p\u003e\r\n\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eBoth chapsd and libchaps.so are installed and fully functional.  chapsd runs as chronos:pkcs11 in order to play nice with other applications loading openCryptoki directly.\u003c/li\u003e\r\n\u003cli\u003eAn upstart configuration file is added for chapsd so it starts before login and respawns automatically.  It depends on tcsd and dbus.\u003c/li\u003e\r\n\u003cli\u003eChaps is added as a run-time dependency to the cryptohome ebuild.\u003c/li\u003e\r\n\u003cli\u003eThe cryptohome upstart configuration is modified to depend on chapsd.\u003c/li\u003e\r\n\u003cli\u003eCryptohome is modified to link against Chaps rather than openCryptoki.\u003c/li\u003e\r\n\u003cli\u003eAll other modules that use openCryptoki are modified (in any order) to use Chaps.  This includes but is not limited to:\u003c/li\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eNSS in Chrome\u003c/li\u003e\r\n\u003cli\u003evpn_manager\u003c/li\u003e\r\n\u003cli\u003eflimflam\u003c/li\u003e\r\n\u003cli\u003ewpa_supplicant\u003c/li\u003e\r\n\u003cli\u003eentd\r\n\r\n\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/ol\u003e\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Phase-2\" /\u003ePhase 2\u003c/h4\u003e\r\n\r\n\u003cp\u003ePhase 2 deployment has the following goals:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eThe PKCS #11 system is fully functional at all times.\u003c/li\u003e\r\n\u003cli\u003eMigration is seamless to all users.\u003c/li\u003e\r\n\u003cli\u003eA partial rollback is possible for a limited time that will put a migrated user token back in the state it was in before migration.  Modifications since migration will be lost; this works like restoring a backup.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eThe following deployment plan meets these goals:\u003c/p\u003e\r\n\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eWhen a token is migrated, all existing files are left intact and a database record is created to indicate that migration has taken place.  Upon rollback, openCryptoki simply keeps working with these files as it did before migration.\u003c/li\u003e\r\n\u003cli\u003eThe switch is in the chapsd upstart configuration: the target library argument is removed to enable Phase 2 logic and is re-added in order to roll back.\u003c/li\u003e\r\n\u003cli\u003eFinally, once confidence is established in the Phase 2 logic, cleanup tasks can be performed that preclude future rollbacks.  These include:\u003c/li\u003e\r\n\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eRemove all openCryptoki-related files in the user token directory.\u003c/li\u003e\r\n\u003cli\u003eRemove all openCryptoki-related logic from cryptohome code.\u003c/li\u003e\r\n\u003cli\u003eRemove openCryptoki from the build.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Project-Information\" /\u003eProject Information\u003c/h2\u003e\r\nThe Chaps code resides in a Chromium OS git repository at \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/chaps.git;a\u003dsummary\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://git.chromium.org/gitweb/?p\u003dchromiumos/platform/chaps.git;a\u003dsummary\u003c/span\u003e\u003c/a\u003e.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Internationalization-and-Localization\" /\u003eInternationalization and Localization\u003c/h2\u003e\r\nThe Chaps library returns the following strings which may need to be translated.  It is assumed that manufacturer ID strings do not require translation.  If a string does not appear in the Chrome OS user interface, it may not require translation.\u003cbr /\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eC_GetInfo returns a library description.\u003c/li\u003e\r\n\u003cli\u003eC_GetSlotInfo returns a slot description.\u003c/li\u003e\r\n\u003cli\u003eC_GetTokenInfo returns a token label, token model, and token description.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Security-Considerations\" /\u003eSecurity Considerations\u003c/h2\u003e\r\nThe following table lists some threats that are mitigated by the Chaps system and provides details on how the threat is mitigated.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003ctable style\u003d\"border:none;border-collapse:collapse;width:624px\"\u003e\r\n\u003ccolgroup\u003e\r\n\u003ccol width\u003d\"*\" /\u003e\r\n\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);background-color:rgb(0,0,128);padding:7px\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(255,255,255);vertical-align:baseline;white-space:pre-wrap\"\u003eThreat\u003c/span\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);background-color:rgb(0,0,128);padding:7px\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(255,255,255);vertical-align:baseline;white-space:pre-wrap\"\u003eMitigation\u003c/span\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker gains access to a user’s cryptographic token services (for example, creates an unauthorized digital signature).\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003echapsd only allows connections from authorized uids (chronos, root) using D-Bus policies.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker owns D-Bus identifier and spoofs cryptographic services.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eD-Bus policy only allows the \"chaps\" user to own the chapsd identifier.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker gains access to private data and keys by accessing run-time memory of the chapsd process.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003echapsd runs as the \"chaps\" user.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker gains access to private data and keys by accessing persistent data stored by chapsd.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAll private data and keys stored on disk are encrypted with the User Encryption Key and stored in the cryptohome partition.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker gains access to a user’s TPM-protected resources.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eTPM-protected resources are authorized by a secret derived from the user’s password and a root-accessible random salt value.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"height:0px\"\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eAttacker stages Chaps persistent data in order to leverage a vulnerability in chapsd to gain control of chapsd.\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003eChaps persistent data is modifiable only by the \"chaps\" user (\u003cb style\u003d\"font-family:Times;font-size:medium;white-space:normal;font-weight:normal\"\u003eThe data needs to be stored in a root-owned directory for this policy to be effective. See \u003cspan style\u003d\"font-size:13px;font-family:Verdana;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://crbug.com/212630\"\u003ecrbug.com/212630\u003c/a\u003e).\u003c/span\u003e\u003c/b\u003e\r\n\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\nIf a user is logged in and an attacker gains chapsd privilege, then nothing prevents this attacker from reading all private data and keys that are not TPM-protected and non-extractable or from creating digital signatures using TPM-protected, non-extractable keys. The following are TPM-protected:\u003cbr /\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eRSA private keys (with modulus 2048 bits or less) that have CKA_TOKEN\u003dTRUE.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eAll objects with CKA_PRIVATE\u003dTRUE are encrypted on disk with a TPM-protected key, even if they are not themselves TPM-protected. The following are not themselves TPM-protected (other than the on-disk encryption):\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003eRSA private keys with modulus larger than 2048 bits.\u003c/li\u003e\r\n\u003cli\u003eRSA private keys with CKA_TOKEN\u003dFALSE.\u003c/li\u003e\r\n\u003cli\u003eAll objects that are not RSA private keys (for example, AES keys, data objects).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Key-Storage-Example\" /\u003eKey Storage Example\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cp\u003eSuppose you have a certificate with an associated private key used to negotiate 802.1x and/or VPN connections. The following PKCS #11 objects would exist in the Chaps database:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eCertificate: This object is public and is not encrypted.\u003c/li\u003e\r\n\u003cli\u003ePublic Key: This object is public and is not encrypted.\u003c/li\u003e\r\n\u003cli\u003ePrivate Key: This object is private and is encrypted with the User Encryption Key. It holds the following attributes:\u003c/li\u003e\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eAuthorization Data: This is random and specific to this key.\u003c/li\u003e\r\n\u003cli\u003ePrivate Key Blob: This is a TPM-wrapped blob.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eEncrypted User Encryption Key: This is encrypted by the User Authorization Key.\u003c/li\u003e\r\n\u003cli\u003eUser Authorization Key Blob: This is a TPM-wrapped blob.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eThe following information would be in chapsd process memory while the token is loaded:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eUser Encryption Key: This has been decrypted using the User Authorization Key and the password-derived secret as authorization data.\u003c/li\u003e\r\n\u003cli\u003eThe Certificate, Public Key, and Private Key, as listed above. The Private Key has been decrypted using the User Encryption Key.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Cryptography\" /\u003eCryptography\u003c/h3\u003e\r\n\r\n\u003cp\u003eThis section lists each way in which Chaps uses cryptography and gives details as to how it is used. In all cases where cryptography is used in software, Chaps uses the openssl crypto library to provide the underlying algorithm implementations.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Random-Numbers\" /\u003eRandom Numbers\u003c/h4\u003e\r\n\r\n\u003cp\u003eThe openssl cryptographically strong pseudo-random-number-generator (PRNG) is used as a source of random numbers. It is seeded using the default openssl seeding mechanism (/dev/urandom on Chrome OS) in combination with 128 random bytes from the TPM. This seeding occurs only once per chapsd process.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-PKCS-11-Software-Mechanisms\" /\u003ePKCS #11 Software Mechanisms\u003c/h4\u003e\r\n\r\n\u003cp\u003eChaps supports a number of mechanisms in software that are not supported by the TPM (for example, SHA, HMAC, AES). The implementation of these mechanisms pass through directly to openssl, including padding and cipher modes, with the following exceptions:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eThe construction of RSA signing data. Chaps constructs the signing data itself and then employs the openssl RSA primitive. This approach guarantees signature compatibility between openssl and a TPM.\u003c/li\u003e\r\n\u003cli\u003eThe generation of DES / DES3 keys. Chaps is still using openssl functions such as DES_is_weak_key() and the openssl PRNG.\r\n\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Encryption-Authentication-of-Persistent-Objects\" /\u003eEncryption / Authentication of Persistent Objects\u003c/h4\u003e\r\n\r\n\u003cp\u003ePrivate object blobs are encrypted using AES-256-CBC with PKCS padding. An initialization vector (IV) is randomly generated for each encryption operation; it is appended to the encrypted blob. An HMAC-SHA512 mac is appended to each encrypted blob. This mac is verified before the decryption is attempted. Verification uses a version of memcmp that reads and compares all bytes regardless of where a mismatch is found.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Authorization-Data-Hashes\" /\u003eAuthorization Data Hashes\u003c/h4\u003e\r\n\r\n\u003cp\u003eOnce authorization data is derived from the user password or similar using scrypt, it is processed as follows:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eAn SHA-1 hash of the authorization data is computed and sent to the TPM. This hash is never stored on disk and is considered as sensitive as the user password.\u003c/li\u003e\r\n\u003cli\u003eAn SHA-512 hash of the authorization data is computed and the first byte of the hash is stored in the token database. This allows Chaps to sanity-check incoming authorization data before sending it to the TPM. Only a single byte is stored because it allows a reasonable sanity check but it is not very useful for a brute-force attack against the authorization data or the user password.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Logging-Plan\" /\u003eLogging Plan\u003c/h2\u003e\r\nAll errors are logged using the facility provided by base/logging.h.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-Plan\" /\u003eTesting Plan\u003c/h2\u003e\r\nChaps is tested using both unit and integration tests.  All unit tests are run from the ebuild test phase.  The integration tests can be run manually or with the autotest framework.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Unit-Integration-Tests\" /\u003eUnit / Integration Tests\u003c/h3\u003e\r\n\r\n\u003cp\u003eThe classes generated by dbus-c++ are not suitable for stubbing / mocking for two reasons: \u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eWe don’t want dbus code running in the unit test environment. Problems with this approach have been noted on other projects.\u003c/li\u003e\r\n\u003cli\u003eThe classes are tightly coupled with types and conventions that are specific to dbus-c++.  \u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eA C++ interface is defined (ChapsInterface) that is very close to the generated proxy and adaptor interfaces but suitable for using and mocking in a test environment.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Client-side-Unit-Tests\" /\u003eClient-side Unit Tests\u003c/h4\u003e\r\n\r\n\u003cp\u003eThe client-side code is unit tested by using a mock proxy and calling the PKCS #11 C interface.  Because the code being tested is called by external code, all argument validation and internal state validation is tested thoroughly resulting in a high level of code coverage.\u003c/p\u003e\r\n\r\n\u003ch4 style\u003d\"text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Daemon-side-Unit-Integration-Tests\" /\u003eDaemon-side Unit / Integration Tests\u003c/h4\u003e\r\n\r\n\u003cp\u003ePhase 1: There are no unit tests per se for the chapsd code in Phase 1 because each layer is either tightly coupled with D-Bus or tightly coupled with openCryptoki.  The chapsd code is tested by a suite that verifies basic functionality of ChapsInterface methods.  This test suite is then run on both a ChapsServiceRedirect instance and on a ChapsProxyImpl instance.  These tests require a configured openCryptoki and, in the ChapsProxyImpl case, a running chapsd instance.  Because of this requirement, the tests must be run on a live system, and they do not run as part of the ebuild test phase.\u003c/p\u003e\r\n\u003cp\u003ePhase 2: The tests from Phase 1 are reused and are run on a ChapsServiceImpl instance and a ChapsProxyImpl instance.  In the case of ChapsServiceImpl, a mock persistence object can be used, and the suite can run as a unit test.  In the case of ChapsProxyImpl, the suite is run as an integration test and requires a running chapsd instance as in Phase 1.  In addition to this, unit tests which are specific to a single class are run for the following classes:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eSlotManager\u003c/li\u003e\r\n\u003cli\u003eSession\u003c/li\u003e\r\n\u003cli\u003eObjectPolicy\u003c/li\u003e\r\n\u003cli\u003eObject\u003c/li\u003e\r\n\u003cli\u003eObjectPool\u003c/li\u003e\r\n\u003cli\u003eObjectStore\u003c/li\u003e\r\n\u003cli\u003eTPMUtility\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eFor each of these unit tests, any references to other objects are mocks.  The following mocks are available:\u003c/p\u003e\r\n\r\n\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli\u003eChapsFactoryMock\u003c/li\u003e\r\n\u003cli\u003eSlotManagerMock\u003c/li\u003e\r\n\u003cli\u003eSessionMock\u003c/li\u003e\r\n\u003cli\u003eObjectPolicyMock\u003c/li\u003e\r\n\u003cli\u003eObjectMock\u003c/li\u003e\r\n\u003cli\u003eObjectPoolMock\u003c/li\u003e\r\n\u003cli\u003eObjectStoreMock\u003c/li\u003e\r\n\u003cli\u003eObjectImporterMock\u003c/li\u003e\r\n\u003cli\u003eTPMUtilityMock\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1642147871835167400"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"}],"author":[{}],"sites$pageName":{"$t":"chaps-technical-design"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7568795946336792325"},"published":{"$t":"2013-01-10T22:34:49.623Z"},"updated":{"$t":"2018-03-08T01:10:18.765Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-08T01:10:14.760Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"1. Overview of the Porting Process"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:250px;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-toc\"\u003e\u003cdiv class\u003d\"goog-toc sites-embed-toc-maxdepth-6\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Basic-Tasks\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eBasic Tasks\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Development-Flow\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDevelopment Flow\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Commits\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eCommits\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upstreaming\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eUpstreaming\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Code-Review\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eCode Review\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Code-Refactors\"\u003e\u003cstrong\u003e2.4 \u003c/strong\u003eCode Refactors\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Testing\"\u003e\u003cstrong\u003e2.5 \u003c/strong\u003eTesting\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Commit-Tags\"\u003e\u003cstrong\u003e2.6 \u003c/strong\u003eCommit Tags\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Pre-upload-Checks\"\u003e\u003cstrong\u003e2.6.1 \u003c/strong\u003ePre-upload Checks\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-BUG-\"\u003e\u003cstrong\u003e2.7 \u003c/strong\u003eBUG\u003d\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-TEST-\"\u003e\u003cstrong\u003e2.8 \u003c/strong\u003eTEST\u003d\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-Source-Subdirectory\"\u003e\u003cstrong\u003e2.9 \u003c/strong\u003eChromium Source Subdirectory\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Other-sections-in-the-U-Boot-Porting-Guide\"\u003e\u003cstrong\u003e2.10 \u003c/strong\u003eOther sections in the U-Boot Porting Guide\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Basic-Tasks\" /\u003eBasic Tasks\u003c/h2\u003e\r\n\u003cp\u003eU-Boot is a highly portable boot loader, supporting many high-end ARM SoCs. It contains a vast array of features and drivers to help speed up the porting process.  When porting U-Boot to a new board, follow these basic steps:\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eAdd support for your SoC. U-Boot supports many common SoCs, and in many cases, a new SoC is a variant of an existing one that can serve as a starting point for the port.\u003c/li\u003e\r\n\u003cli\u003eAdd a board configuration file and a board implementation file containing code specific to your board.\u003c/li\u003e\r\n\u003cli\u003eAdd or modify any drivers you need for your platform.\u003c/li\u003e\r\n\u003cli\u003eBring in the kernel device tree file if available (or write a new device tree).\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eThis guide describes these steps in some detail, with a focus on Chrome OS-specific implementations.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eNote:  The following information was written for Tegra in 2011 and is somewhat out of date.\u003c/span\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Development-Flow\" /\u003eDevelopment Flow\u003c/h2\u003e\r\n\u003cp\u003eChromium OS uses U-Boot as its boot loader on ARM and x86. This page describes the development flow, requirements for commits submitted to the project, upstreaming responsibilities and Chromium OS-specific features.\u003c/p\u003e\r\n\u003cp\u003eBefore reading this document, please see \u003ca href\u003d\"http://www.denx.de/wiki/U-Boot\" rel\u003d\"nofollow\"\u003ehttp://www.denx.de/wiki/U-Boot\u003c/a\u003e and at the very least, read:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.denx.de/wiki/U-Boot/DesignPrinciples\" rel\u003d\"nofollow\"\u003ehttp://www.denx.de/wiki/U-Boot/DesignPrinciples\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.denx.de/wiki/U-Boot/CodingStyle\" rel\u003d\"nofollow\"\u003ehttp://www.denx.de/wiki/U-Boot/CodingStyle\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.denx.de/wiki/U-Boot/Patches\" rel\u003d\"nofollow\"\u003ehttp://www.denx.de/wiki/U-Boot/Patches\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eand check out the U-Boot mailing list\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eExcept during a rebase period, Chromium OS has a single U-Boot repository, called ‘u-boot.git’, containing all U-Boot source code. There is no \u003cbr /\u003e\r\nsplit between different SOCs, no split for Chromium OS-specific code, no split at all. We deal with the different types of commits using commit tags.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Commits\" /\u003eCommits\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eFormalized commit structure rules (see ‘Commit Rules’ below)\u003c/li\u003e\r\n\u003cli\u003eAll Chromium OS source is in its own subdirectory (see ‘Chromium Source Subdirectory’ below)\u003c/li\u003e\r\n\u003cli\u003eEncourage compliance with pre-submit checks and reverts\u003c/li\u003e\r\n\u003cli\u003eTag every commit to indicate its intended destination\u003c/li\u003e\r\n\u003cli\u003eEach commit must be producing a source tree which builds and runs (bisectability)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Upstreaming\" /\u003eUpstreaming\u003c/h3\u003e\r\nWe plan to upstream most or all of our code. Any code that you write will likely either be dropped or sent upstream. Please consider when writing code that it should fit with U-Boot conventions\u003cbr /\u003e\r\nLet’s call the person who is upstreaming a particular feature the ‘canoe captain’.\r\n\u003cul\u003e\u003cli\u003eThe canoe captain (with upstreaming responsibility) lies with:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eCommitter for patches against upstream code\u003c/li\u003e\r\n\u003cli\u003eSOC Vendor for patches against vendor code\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eClearly mark commits that are destined for upstream according to destination\u003c/li\u003e\r\n\u003cli\u003eOpen an ‘upstream needed’ tracking bug when you begin upstreaming work. There should be one bug per group of related commits. For example ‘upstream I2C driver for Tegra’.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ePatches should be sent upstream within one month\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003eCanoe captain is responsible for rebasing those commits which are not upstream\u003c/li\u003e\r\n\u003cli\u003eCode should be accepted upstream in the next merge cycle (i.e. within 3 months)\u003c/li\u003e\r\n\u003cli\u003eShould upstream activity produce the need to adjust or rewrite the commit, then this responsibility lies with the canoe captain.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Code-Review\" /\u003eCode Review\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eAdd 2-3 reviewers, including 1-2 original code authors\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eFor vendor code, at least one reviewer or the author should be with the vendor company\u003c/li\u003e\r\n\u003cli\u003eAt least one reviewer should be a Chromium OS U-Boot committer\u003c/li\u003e\r\n\u003cli\u003eVendor code requires an LGTM from the both types of reviewers; other code just needs an LGTM from the latter\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003ePlease first carefully check you have followed the rules on commit tags, BUG and TEST\u003c/li\u003e\r\n\u003cli\u003eInitial reviews should be completed within one day during the working week\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eIf not possible, then please add a comment to the commit letting the author know there will be a delay, and offer an alternative\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eRebases and minor don’t need a fresh LGTM. So if you get an LGTM on patch 3, and just fix requested nits or do a rebase to get patch 4, you can push it.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Code-Refactors\" /\u003eCode Refactors\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eWe encourage discussion of planned refactors using the issue tracker (crbug.com). Those which are in upstream code should be discussed on the U-Boot mailing list\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Testing\" /\u003eTesting\u003c/h3\u003e\r\n\u003cp\u003eMost testing is currently manual. It is important that people can repeat your test steps later without a deep knowledge of your environment, board, commit and mind.\u003c/p\u003e\r\n\u003cp\u003eYou may find the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/1-overview/the-crosfw-script\"\u003ecrosfw\u003c/a\u003e script useful for building and testing U-Boot.\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cb\u003eMandatory testing:\u003c/b\u003e\r\n\r\n\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eBuild and boot\u003c/b\u003e through to kernel (verified or non-verified) on your chosen hardware\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eCheck that you change has not affected operation of peripherals related to your change\u003c/li\u003e\r\n\u003cli\u003eAdd a note that you did this (and the result) in your TEST\u003d description (see below)\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eIf you change modifies code accessible from another architecture, \u003cb\u003ebuild\u003c/b\u003e for that architecture too\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eSo if your chosen hardware is ARM, but you are not changing ARM-specific code, you should build for x86\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eAdd a note about this to TEST\u003d\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cp\u003eSuggested testing:\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eIf changing generic code, you should ensure that U-Boot continues to build for all targets (run MAKEALL)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eAdd a note about this to TEST\u003d\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Commit-Tags\" /\u003eCommit Tags\u003c/h3\u003e\r\n\u003cp\u003eAll commits should have exactly one tag from the following table at the start of the subject line. The tag indicates the intended destination for the commit. Note that standard upstream commit tags are encouraged also (i2c, usb, net, lcd, spi) and these follow the primary tag. Tags are always lower case.\u003c/p\u003e\r\n\u003cp\u003eCommits cannot normally span more than one of the paths below, so commits in multiple areas must be split into different commits. The idea to keep in mind is that this is like having separate repositories, but with less admin/productivity overhead.\u003c/p\u003e\r\n\u003cp\u003eWhere a change requires that (say) Chromium, Tegra and Samsung code must change at the same time to avoid a build breakage, the ‘split’ tag should be used first, and the rest in alphabetical order as in ‘split: chromium: exynos: tegra: fiddle with something’.\u003c/p\u003e\r\n\u003ctable border\u003d\"1\" style\u003d\"border:1px solid rgb(170,170,170);border-collapse:collapse\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e\u003cb\u003eTag:\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:34px\"\u003e\u003cb\u003eMeaning\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:34px\"\u003e\u003cb\u003eCanoe Captain\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:34px\"\u003e\u003cb\u003ePath\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003ecros:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003eLocal patches, will not conceivably go upstream. Use for verified boot mainly\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003e-\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003ecros/\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:47px\"\u003etegra:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:47px\"\u003eTegra SOC, board and driver code\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:47px\"\u003eNvidia\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:47px\"\u003earch/arm/cpu/armv7/tegra*/\u003cbr /\u003e\r\nboard/nvidia/\u003cbr /\u003e\r\ndrivers/\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:47px\"\u003eexynos:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:47px\"\u003eSamsung SOC, board and driver code\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:47px\"\u003eSamsung\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:47px\"\u003earch/arm/cpu/armv7/exynos*/\u003cbr /\u003e\r\nboard/samsung/\u003cbr /\u003e\r\ndrivers/\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003earm:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003eARM-generic patches, committer mans the canoe\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003eCommitter\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003earch/arm\u003cbr /\u003e\r\n(but not in an soc subdir)\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003ex86:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003ex86-generic patches, committer mans the canoe\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003eCommitter\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:15px\"\u003eupstream:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:15px\"\u003ePulled in from upstream\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:15px\"\u003e-\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:15px\"\u003eany\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003edrop:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003eUrgent / unclean / factory patches which we will drop on next rebase\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003e-\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003eany\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003esplit:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003eIndicates a commit which must be split to send upstream\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:107px;height:31px\"\u003egen:\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:282px;height:31px\"\u003eGeneric (not architecture-specific) commit which should go upstream\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:142px;height:31px\"\u003eCommitter\u003c/td\u003e\r\n\u003ctd style\u003d\"border:1px dotted rgb(170,170,170);padding:7px;width:229px;height:31px\"\u003eany. Note that when sending upstream this tag is dropped\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"font-family:arial,sans-serif;width:107px;height:18px\"\u003e config:\u003c/td\u003e\r\n\u003ctd style\u003d\"width:282px;height:18px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e Change to a board configuration file\u003c/span\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"width:142px;height:18px\"\u003e -\u003c/td\u003e\r\n\u003ctd style\u003d\"font-family:arial,sans-serif;width:229px;height:18px\"\u003e include/configs/\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Pre-upload-Checks\" /\u003ePre-upload Checks\u003c/h4\u003e\r\n\u003cp\u003eBefore uploading a commit for review, please do the following checks:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eThe commit is ‘checkpatch’ clean (repo upload checks this)\u003c/li\u003e\r\n\u003cli\u003eThe commit has tags indicated its upstream destination\u003c/li\u003e\r\n\u003cli\u003eThe commit has a valid bug referenced, by a tag on a line by itself\u003c/li\u003e\r\n\u003cli\u003eThe commit has a valid test case. \u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-BUG-\" /\u003eBUG\u003d\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eFor public bugs: BUG\u003dchromium-os:12435\u003c/li\u003e\r\n\u003cli\u003eFor private bugs: BUG\u003dchrome-os-partner:1234\u003c/li\u003e\r\n\u003cli\u003eIt is possible to use BUG\u003dnone in some cases. We should use this rarely. Examples where is it useful are when:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eThe commit is a small clean-up not related to a particular subsystem. Examples are fixing a comment or code style\u003c/li\u003e\r\n\u003cli\u003eThe commit fixes compilation warnings\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eIn most other cases, if you cannot find a bug to reference, you should file a new public bug and reference that.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-TEST-\" /\u003eTEST\u003d\u003c/h3\u003e\r\n\u003cp\u003eThis should be detailed enough that another person without particular knowledge of your code can run the procedure you detail, and verify your commit. The information should specific. Examples are:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eTEST\u003dbuild and run on daisy; run ‘bootp’ command, see that it finds an IP address\u003c/li\u003e\r\n\u003cli\u003eTEST\u003dmanual\u003cbr /\u003e\r\n      . after enabling configuration necessary for this code to compile\u003cbr /\u003e\r\n        in, added a printout statement in main.c to report the clock\u003cbr /\u003e\r\n        frequency and to print a few strings at get_tbclk() tick\u003cbr /\u003e\r\n        intervals. The clock frequency was correctly reported at 1800 MHz\u003cbr /\u003e\r\n        and the printouts came out one second apart.\u003c/li\u003e\r\n\u003cli\u003eTEST\u003dboot from SD card; run sd_to_spi; see that it completes; then boot from\u003cbr /\u003e\r\n    SPI and see that the U-Boot timestamp is correct.\u003c/li\u003e\r\n\u003cli\u003eTEST\u003dbuild okay and boot on Daisy\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eSome bad examples of test information are:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eTEST\u003dtested on daisy (how? need detail on what was done and what result as obtained)\u003c/li\u003e\r\n\u003cli\u003eTEST\u003dnone (surely you are least built it, did you run it on any board?)\u003c/li\u003e\r\n\u003cli\u003eTEST\u003dverified that it worked well (how?)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Chromium-Source-Subdirectory\" /\u003eChromium Source Subdirectory\u003c/h3\u003e\r\n\u003cp\u003eOur local code commits can be broken into several areas, but almost all code is in a ‘cros/’ subdirectory.  Here is the current split:\u003c/p\u003e\r\n\u003ctable border\u003d\"1\" style\u003d\"border:1px solid rgb(170,170,170);border-collapse:collapse\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003e\u003cb\u003eDirectory\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003e\u003cb\u003eUsed for\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003e\u003cb\u003ePreviously\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eAll Chromium OS commits\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003eVarious\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/tegra\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eImplementation of Chrome OS low-level API on Tegra SOCs\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003eboard/nvidia/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/exynos\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eImplementation of Chrome OS low-level API on Exynos SOCs\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003e-\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/coreboot\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eImplementation of Chrome OS low-level API on Coreboot\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003eboard/chromebook-x86/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/lib\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eChrome OS library functions\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003elib/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/vboot\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eVerified boot exported functions\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003elib/vbexport\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/cmd\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eChrome OS commands\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003ecommon/cmd_....c\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"width:108px;height:15px\"\u003ecros/include\u003c/td\u003e\r\n\u003ctd style\u003d\"width:402px;height:15px\"\u003eChrome OS headers\u003c/td\u003e\r\n\u003ctd style\u003d\"width:278px;height:15px\"\u003einclude/chromeos\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Other-sections-in-the-U-Boot-Porting-Guide\" /\u003eOther sections in the U-Boot Porting Guide\u003c/h3\u003e\r\n\u003cdiv\u003e  1.  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/1-overview\"\u003eOverview of the Porting Process\u003c/a\u003e (this page)\u003c/div\u003e\r\n\u003cdiv\u003e  2.  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/2-concepts\"\u003eConcepts\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e  3.  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/u-boot-drivers\"\u003eU-Boot Drivers\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8191782580396249944"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-porting-guide/1-overview"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7568795946336792325"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7568795946336792325"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7568795946336792325"}],"author":[{"email":{"$t":"josiew@google.com"}}],"sites$pageName":{"$t":"1-overview"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2923435873885300950"},"published":{"$t":"2015-11-25T21:35:09.753Z"},"updated":{"$t":"2018-03-06T17:38:21.765Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-06T17:38:19.857Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GitHub Collaboration"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eThis document explains how to collaborate on work in progress by using Git and pushing changes to GitHub.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAlternatives would be to email code diffs or use codereview.chromium.org and \u003ccode\u003egit cl patch\u003c/code\u003e. However they are brittle and time consuming when patches do no apply cleanly and or are part of several pipelined or dependent patches.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCollaboration via git is made easy by simply using \u003ccode\u003egit merge\u003c/code\u003e to include code from other patches into a local branch you are working with.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003eCreate a chromium fork on GitHub i\u003c/span\u003ef you will share code with others.\u003c/li\u003e\u003col\u003e\u003cli\u003e\u003ca href\u003d\"https://help.github.com/articles/fork-a-repo/\" style\u003d\"font-size:13.3333px\" rel\u003d\"nofollow\"\u003e\u003cb\u003eFork\u003c/b\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13.3333px\"\u003e an existing chromium repository on GitHub \u003c/span\u003esuch as:\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003ca href\u003d\"https://github.com/chromium/chromium\" rel\u003d\"nofollow\"\u003ehttps://github.com/chromium/chromium\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/\" rel\u003d\"nofollow\"\u003e\u003cb\u003eDelete branches\u003c/b\u003e\u003c/a\u003e you are not interested in.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eAdd remote references to GitHub respositories (yours or others)\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-size:10pt;background-color:transparent\"\u003egit remote add g https://github.com/your-user-name/chromium\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(0,96,0);background-color:transparent\"\u003egit remote add \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-size:13.3333px;background-color:transparent\"\u003eother-repo-name\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(0,96,0);background-color:transparent\"\u003e https://github.com/\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-size:13.3333px;background-color:transparent\"\u003eother-user-name\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;color:rgb(0,96,0);background-color:transparent\"\u003e/chromium\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e(I typically name my own github repo just 'g')\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:13.3333px\"\u003e\u003ca href\u003d\"https://git-scm.com/docs/git-fetch\" rel\u003d\"nofollow\"\u003eFetch\u003c/a\u003e from github repos\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit fetch g\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit fetch other-repo-name\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eOccasionally add \u003c/span\u003e\u003ccode style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e--prune\u003c/code\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e to remove any remote-tracking references that no longer exist on the remote.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003ca href\u003d\"https://git-scm.com/docs/git-merge\" rel\u003d\"nofollow\"\u003eMerge\u003c/a\u003e from github repos\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit merge other-repo-name/branch-name\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003e\u003ca href\u003d\"https://git-scm.com/docs/git-push\" rel\u003d\"nofollow\"\u003ePush\u003c/a\u003e to github\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003ePush current branch\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit push g HEAD\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003ePush all branches where the local names match remote names.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit push g :\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:13.3333px;background-color:transparent\"\u003eDelete a remote branch\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:13.3333px;background-color:transparent\"\u003egit push g -f :remote-branch\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/github-collaboration"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2923435873885300950"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2923435873885300950"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2923435873885300950"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$pageName":{"$t":"github-collaboration"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1700490970012686007"},"published":{"$t":"2018-03-03T06:55:37.338Z"},"updated":{"$t":"2018-03-03T07:05:21.007Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2018-03-03T07:05:18.616Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Download"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-one-column sites-layout-hbox\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-1\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan\u003e\u003cp style\u003d\"text-align:left;line-height:1.38;margin-top:0pt;margin-bottom:6pt\"\u003e\u003cfont face\u003d\"Open Sans\"\u003e\u003cspan style\u003d\"font-size:32px;white-space:pre-wrap\"\u003e\u003cb\u003eDiagnose download issues\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDownload used to use NetLog for logging purpose, as it is considered part of the network operation. With network servicification, NetLog will no longer be accessible outside the network process. As a result, download is switching to TraceEvent for logging.\u003c/span\u003e\u003c/p\u003e\u003ch1 style\u003d\"line-height:1.38;margin-top:24pt;margin-bottom:6pt\"\u003e\u003ca name\u003d\"TOC-Netlog-format-this-is-deprecated-\" /\u003eNetlog format (this is deprecated)\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFor a DownloadItem, its netlog looks like this:\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-21571799:-DOWNLOAD\" /\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003e21571799: DOWNLOAD\u003c/span\u003e\u003c/h4\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-gzip-1.3.9.tar\" /\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003egzip-1.3.9.tar\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStart Time: 2017-11-06 11:36:31.319\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81821 [st\u003d  0] +DOWNLOAD_ITEM_ACTIVE  [dt\u003d539]\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; danger_type \u003d \"NOT_DANGEROUS\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; file_name \u003d \"gzip-1.3.9.tar\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; final_url \u003d \"http://ftp.gnu.org/gnu/gzip/gzip-1.3.9.tar\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; has_user_gesture \u003d true\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; id \u003d \"3640\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; original_url \u003d \"http://ftp.gnu.org/gnu/gzip/gzip-1.3.9.tar\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; start_offset \u003d \"0\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                  --\u0026gt; type \u003d \"NEW_DOWNLOAD\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81821 [st\u003d  0] DOWNLOAD_URL_REQUEST\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                   --\u0026gt; source_dependency \u003d 21571791 (URL_REQUEST)\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81822 [st\u003d  1] DOWNLOAD_FILE_CREATED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                   --\u0026gt; source_dependency \u003d 21571800 (DOWNLOAD_FILE)\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81825 [st\u003d  4] DOWNLOAD_ITEM_UPDATED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; bytes_so_far \u003d \"0\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81833 [st\u003d 12]    DOWNLOAD_ITEM_SAFETY_STATE_UPDATED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; danger_type \u003d \"MAYBE_DANGEROUS_CONTENT\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81865 [st\u003d 44]    DOWNLOAD_ITEM_RENAMED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; new_filename \u003d \"/usr/local/google/home/qinmin/Downloads/Unconfirmed 246585.crdownload\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; old_filename \u003d \"\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d82304 [st\u003d483]    DOWNLOAD_ITEM_UPDATED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; bytes_so_far \u003d \"1648640\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d82305 [st\u003d484]    DOWNLOAD_ITEM_UPDATED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; bytes_so_far \u003d \"1648640\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d82360 [st\u003d539]    DOWNLOAD_ITEM_RENAMED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; new_filename \u003d \"/usr/local/google/home/qinmin/Downloads/gzip-1.3.9.tar\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; old_filename \u003d \"/usr/local/google/home/qinmin/Downloads/Unconfirmed 246585.crdownload\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d82360 [st\u003d539]    DOWNLOAD_ITEM_COMPLETING\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; bytes_so_far \u003d \"1648640\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; final_hash \u003d \"A08ABC68B607A70450930E698A90A0C30C81CE45A656CC47D2B89CA87C059DF6\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d82360 [st\u003d539]    DOWNLOAD_ITEM_FINISHED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; auto_opened \u003d \"no\"\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFor a DownloadFile,  it looks like:\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-21571800:-DOWNLOAD_FILE\" /\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;font-weight:400;vertical-align:baseline;white-space:pre-wrap\"\u003e21571800: DOWNLOAD_FILE\u003c/span\u003e\u003c/h4\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eStart Time: 2017-11-06 11:36:31.320\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81822 [st\u003d  0] +DOWNLOAD_FILE_ACTIVE  [dt\u003d538]\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                 --\u0026gt; source_dependency \u003d 21571799 (DOWNLOAD)\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81822 [st\u003d  0] +DOWNLOAD_FILE_OPENED  [dt\u003d43]\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; file_name \u003d \"/usr/local/google/home/qinmin/.local/share/.com.google.Chrome.pzFBTU\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                    --\u0026gt; start_offset \u003d \"0\"\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81822 [st\u003d  0] DOWNLOAD_STREAM_DRAINED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                      --\u0026gt; num_buffers \u003d 0\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e                      --\u0026gt; stream_size \u003d 0\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003et\u003d81865 [st\u003d 43]   -DOWNLOAD_FILE_OPENED\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Open Sans;backg